代码之家  ›  专栏  ›  技术社区  ›  dimba

异常情况评估

  •  3
  • dimba  · 技术社区  · 14 年前

    以下代码:

    #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

    1 回复  |  直到 14 年前
        1
  •  1
  •   F'x    14 年前

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

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