避免有符号整型与无符号整型相互转换
12.3 ID_signChangeCast
有符号整型与无符号整型相互转换易导致意料之外的错误。
整型转换规则:
- 如果向布尔型以外的其他整数类型转换,且值在新类型取值范围内,值不变
- 否则,如果新类型为无符号整型,将值不断加减 M + 1 直至进入新类型取值范围,M 为新类型最大值
- 否则,如果新类型为有符号整型,相关转换由实现定义
负数转为无符号整数往往会得到意料之外的结果,无符号整数转为有符号整数也可能导致移植相关的问题,所以应避免有符号整型与无符号整型之间的隐式转换,相关显式转换也应在合理的条件下完成。
示例:
signed s = -1;
unsigned u = 1;
printf("%d\n", s < u); // Non-compliant
例中有符号整数 s 的值为 -1,无符号整数 u 的值为 1,s 理应小于 u,但由于“类型提升”,s 会被转为无符号整数,值为无符号整数的最大值,s < u 的实际结果为 0。
配置
allowSmallUnsignedTypes: 是否允许 unsigned char、unsigned short 隐式转为 int 或更大取值范围的类型
allowPtrdiffTypeToSizeType: 是否允许 ptrdiff_t 隐式转为 size_t
相关
依据
ISO/IEC 9899:1999 6.3.1.3
ISO/IEC 9899:2011 6.3.1.3
ISO/IEC 14882:2003 4.7
ISO/IEC 14882:2011 4.7