带有 int 和 UINT32 的警告 C4018,但不带有 int 和 UCHAR
Warning C4018 with int and UINT32, but not with int and UCHAR
使用 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
为什么行为不同?
比较不同类型的整数时,应用通常的算术转换。这意味着如果适用,首先提升两个整数,然后,如果结果仍然是不同的类型,则将精度较低的类型转换为精度较高的类型,或者,如果两者具有相同的精度,则将有符号的转换为无符号的一.
所以在你的第一种情况下,你有一个无符号整数和一个有符号整数。两者都没有提升,因为它们都已经是整数,所以有符号的整数被转换为无符号的。当它作为比较的一部分发生时,这会触发警告。
在你的第二种情况下,UCHAR
被提升为一个有符号整数,因为它可以用一个来表示。现在您正在比较两个带符号的整数,因此不需要进行进一步的转换。
使用 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
为什么行为不同?
比较不同类型的整数时,应用通常的算术转换。这意味着如果适用,首先提升两个整数,然后,如果结果仍然是不同的类型,则将精度较低的类型转换为精度较高的类型,或者,如果两者具有相同的精度,则将有符号的转换为无符号的一.
所以在你的第一种情况下,你有一个无符号整数和一个有符号整数。两者都没有提升,因为它们都已经是整数,所以有符号的整数被转换为无符号的。当它作为比较的一部分发生时,这会触发警告。
在你的第二种情况下,UCHAR
被提升为一个有符号整数,因为它可以用一个来表示。现在您正在比较两个带符号的整数,因此不需要进行进一步的转换。