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

时间:2011-09-22 08:24:47

标签: c++ comparison compiler-warnings

我有以下代码:

unsigned int a;
if (a > numeric_limits<int>::max())
   do_stuff();

编译时,gcc抱怨

  

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

好的,我明白了

但是,使用以下代码:

unsigned int a;
if (a > (numeric_limits<int>::max()))
   do_stuff();

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

3 个答案:

答案 0 :(得分:5)

这是因为它是一个错误。见bug 50012

答案 1 :(得分:0)

我目前无法访问C ++编译器来测试这个,但我认为这可能会没有任何警告:

unsigned int a;
if (a > numeric_limits<unsigned int>::max())
   do_stuff();

答案 2 :(得分:-1)

答案在于gcc处理intunsigned int的方式。

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