为什么32位程序的结果与64位程序的结果不同?

时间:2018-03-20 14:24:21

标签: c

我正在进行整数字节级表示的赋值。我写了一个小程序:

e1.c

int main(void) {
    printf("%d\n", -2147483648 < 2147483647);
    return 0;
}

当我使用C89标准编译32位版本的可执行文件时,使用命令gcc e1.c -m64 -std=c89 -g -O0 -o e1,它按预期工作:它打印0,表明C编译器认为值{ {1}}为2147483648,因此它将表达式的其余部分转换为unsigned int。但奇怪的是,这种关系并不适用于打印unsigned int的64位版本。

任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:10)

The C89 spec reads:

  

整数常量的类型是对应的第一个   可以表示其值的列表。未加十进制的:int,   long intunsigned long int; [...]

因此,文字2147483648的类型分别取决于intlongunsigned long的大小。我们假设int是32位,就像在许多平台上一样(在您的平台上可能就是这种情况)。

在32位平台上,long通常为32位。因此,2147483648的类型为unsigned long

在64位平台上,long通常为64位(尽管某些平台,如MSVC,仍将使用32位用于long)。因此,2147483648的类型为long

这导致您看到的差异。在一种情况下,你否定unsigned long,而在另一种情况下,你否定了long

在32位平台上,-2147483648评估为2147483648(使用unsigned long类型)。因此,得到的比较结果为2147483648 < 2147483647,其评估结果为0

在64位平台上,-2147483648评估为-2147483648(使用long类型)。因此,得到的比较结果为-2147483648 < 2147483647,其评估结果为1