繁体   English   中英

使用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

为什么行为不同?

比较不同类型的整数时,通常采用算术转换。 这意味着如果适用,则首先提升两个整数,然后,如果结果仍然是不同类型,则将精度较低的类型转换为精度较高的类型,或者,如果两个精度相同,则将带符号的类型转换为无符号的类型一。

因此,在第一种情况下,您有一个unsigned int和一个signed int。 由于它们都已经是int,因此都不会被提升,因此有符号的int会转换为unsigned。 当它作为比较的一部分发生时,将触发警告。

在第二种情况下,因为UCHAR可以由一个表示,所以它会被提升为一个有符号的int。 现在,您正在比较两个带符号的整数,因此不需要进行进一步的转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM