gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:01:41 27 4
gpt4 key购买 nike

我正在处理整数字节级表示的作业。我写了一个小程序:

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 编译器将值 2147483648 视为 unsigned int,因此它将表达式的其余部分转换为 无符号整数。但奇怪的是,这种关系在打印 1 的 64 位版本中并不成立。

谁能解释一下?

最佳答案

The C89 spec reads:

The type of an integer constant is the first of the corresponding list in which its value can be represented. Unsuffixed decimal: int, long int, unsigned long int; [...]

因此,文字的类型 2147483648取决于 int 的大小, long , 和 unsigned 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 .

关于c - 为什么 32 位程序的结果与 64 位程序的结果不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49386851/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com