使用VS 2017,此片段生成编译器警告C4018:
UINT32 numChars(2);
int i;
for( i=0; i<numChars; i++ )
但这不是:
UCHAR numChars(2);
int i;
for( i=0; i<numChars; i++ )
回想一下
typedef unsigned int UINT32
typedef unsigned char UCHAR
为什么行为不同?
答案 0 :(得分:2)
当比较不同类型的整数时,将应用通常的算术转换。这意味着如果适用,则首先提升两个整数,然后,如果结果仍然是不同类型,则将精度较低的类型转换为精度较高的类型,或者,如果两个精度相同,则将带符号的类型转换为无符号的类型一个。
因此,在第一种情况下,您具有未签名的int和已签名的int。由于它们都已经是int,因此都不会被提升,因此有符号的int会转换为unsigned。当它作为比较的一部分发生时,将触发警告。
在第二种情况下,UCHAR
被提升为带符号的int,因为它可以由一个表示。现在,您正在比较两个带符号的整数,因此无需进行进一步的转换。