奇怪的条件评估

时间:2010-11-08 13:47:49

标签: gcc 64-bit porting

以下代码:

#include <stdint.h>

int main() {
    uint8_t Byte;

    if (Byte < 0) { }
}

发出以下编译警告:

main.cpp: In function `int main()':
main.cpp:6: warning: comparison is always false due to limited range of data type

这很好。但是当我改变条件时:

(1) if (true || (Byte < 0)) { }

我仍然收到警告,而我希望收到警告,例如“比较总是如此......”:)

如果我将Byte声明更改为:

(2) uint32_t Byte;

警告消失。

我该如何解释这种行为?

我的系统是带有gcc 4.1.2的64位RHEL 5.3。

修改

(1)不是问题,我只是误解了编译器警告。 它并没有说整个if是 false 而是“Byte&lt; 0”。

所以问题只是(2) - 为什么 Byte 类型会触发编译器警告。 常量“0”的类型为 int ,因此它的4个字节。因此,如果uint8_t与 int

,它必须与比较相关

1 个答案:

答案 0 :(得分:1)

将无符号值与0 signed int进行比较时,该值首先(隐式)转换为int。由于uint8_t介于0和255之间,因此在转换为32位int时为正。

另一方面,uint32_t介于0和2 ^ 32-1之间,因此当转换为32位int时,它可能会换行并变为负数(所有高于或等于2 ^ 31的值都将被强制转换实际上是负的int值。所以,你的比较并不总是正确的,编译器是对的。