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

变量>-1如何在C中精确求值?

  •  3
  • Niclas  · 技术社区  · 2 年前
    #include <stdio.h>
    #include <stdint.h>
    int main()
    {
        uint16_t peter = 8;
        uint32_t peter2 = 8;
        if(peter > -1)
        {
            printf("Peter true\n"); //expected
        } 
        if (peter2 > -1)
        {
            printf("Peter 2 true\n"); //wtf, why not
        }
    
        return 0;
    }
    

    为什么第一个语句进入子句,而第二个语句不进入(在32位体系结构上)?

    2 回复  |  直到 2 年前
        1
  •  3
  •   Pascal Cuoq    2 年前

    之间差异的解释 peter > -1 peter2 > -1 是整数提升的概念,也是常用的算术转换。

    Integer promotion 意味着任何整数类型 t 窄于 int 被提升为 int 如果 int 可以包含的所有值 t unsigned int 否则在您的示例和编译器中,升级应用于 peter ,转换为 int 在与比较之前 -1 (也有类型 int ).

    然后 usual arithmetic conversions 决定当算术二进制运算时会发生什么,在这里 > ,应用于不同类型的操作数。在相同宽度的无符号整数类型和有符号整数类型之间,这些规则规定有符号操作数在运算之前转换为无符号操作数。

    1. 具有类型 int 。当它与 peter2 ,通常的算术转换意味着 1. 转换为 uint32_t ,成为一个大值(大于 8 ).

        2
  •  1
  •   Some programmer dude    2 年前

    这一切都与有关 implicit conversions .

    对于 peter > -1 的价值 peter 促进 int 。但是 peter2 > -1 它的价值 -1 哪个是 转换 uint32_t .

    two's complement 系统 1. 都是1,因此转换为值 2147483647 ,比值大很多 8 属于 peter2 ,使条件为假。