【问题标题】:Strange condition evaluation奇异条件评估
【发布时间】:2010-11-08 13:47:49
【问题描述】:

以下代码:

#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;

警告消失。

我该如何解释这种行为?

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

编辑:

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

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

的比较有关

【问题讨论】:

    标签: gcc 64-bit porting


    【解决方案1】:

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

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

    【讨论】: