我有以下代码:
unsigned int a;
if (a > numeric_limits<int>::max())
do_stuff();
编译时,gcc抱怨
警告:“签名和未签名之间的比较”
好的,我明白了
但是,使用以下代码:
unsigned int a;
if (a > (numeric_limits<int>::max()))
do_stuff();
警告不再显示,我真的不知道为什么...... 这种行为是否有任何合理的原因,或者我做错了什么?!
答案 0 :(得分:5)
这是因为它是一个错误。见bug 50012
答案 1 :(得分:0)
我目前无法访问C ++编译器来测试这个,但我认为这可能会没有任何警告:
unsigned int a;
if (a > numeric_limits<unsigned int>::max())
do_stuff();
答案 2 :(得分:-1)
答案在于gcc处理int
和unsigned int
的方式。
unsigned int
和int
都存储2个字节的值。它们之间的区别在于unsigned int
不支持负值。它只能存储0-65,535的值。
当GCC看到int和unsigned int之间的比较时,它将int转换为正数。例如,如果int
的值为-2,则将其转换为2.但如果int前面带有()运算符。 (INT)。 GCC将其解释为正数(但仍将其转换)并且不会发出警告。