使用gcc和有符号/无符号比较的奇怪警告行为

mal*_*ute 8 c++ comparison compiler-warnings

我有以下代码:

unsigned int a;
if (a > numeric_limits<int>::max())
   do_stuff();
Run Code Online (Sandbox Code Playgroud)

编译时,gcc抱怨

警告:"签名和未签名之间的比较"

好的,我明白了

但是,使用以下代码:

unsigned int a;
if (a > (numeric_limits<int>::max()))
   do_stuff();
Run Code Online (Sandbox Code Playgroud)

警告不再显示,我真的不知道为什么......这种行为是否有任何合理的原因,或者我做错了什么?!

Esb*_*sen 5

这是因为它是一个错误。看到错误50012


App*_*ker -1

int答案在于 gcc 处理和 的方式unsigned int

unsigned int并且int都存储一个 2 字节值。它们之间的区别是unsigned int不支持负值。它只能存储 0-65,535 之间的值。当 GCC 看到 int 和 unsigned int 之间的比较时,它会将 int 转换为正数。例如,如果 的值int是 -2 ,它会将其转换为 2。但是如果 int 前面有 () 运算符。(整数)。GCC 将其解释为正数(但仍将其转换)并且不发出警告。