以下代码:
#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)) { }
我仍然收到警告,而我希望收到类似“比较总是正确的…”的警告:
如果我将字节声明更改为:
(2) uint32_t Byte;
警告消失。
我如何解释这种行为?
我的系统是随GCC4.1.2一起提供的RHEL 5.3 64位。
编辑:
(1)不是问题,我只是误解了编译器警告。 它没有说整个如果是 假 而是“字节<0”。
所以问题只是(2)-为什么 字节 类型触发编译器警告。 常量“0”的类型为 int ,所以是4个字节。因此,如果uint8与 int
将无符号值与0有符号int进行比较时,该值首先(隐式)强制转换为int。由于uint8_t介于0和255之间,因此当强制转换为32位int时,该值为正值。
另一方面,uint32_t介于0和2^32-1之间,因此当转换为32位int时,它可能会换行并变为负数(实际上,所有大于或等于2^31的值都将转换为负数int)。所以,您的比较并不总是正确的,编译器是正确的。