以下代码:
#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
,它必须与比较相关答案 0 :(得分:1)
将无符号值与0 signed int进行比较时,该值首先(隐式)转换为int。由于uint8_t介于0和255之间,因此在转换为32位int时为正。
另一方面,uint32_t介于0和2 ^ 32-1之间,因此当转换为32位int时,它可能会换行并变为负数(所有高于或等于2 ^ 31的值都将被强制转换实际上是负的int值。所以,你的比较并不总是正确的,编译器是对的。