-2

Why does this simple C program print -2147483648?

#include <stdio.h>

int main(){
    printf("%i", (int)2147483648);
    return 0;
}

Of course if I don't cast it and use %lld as the format specifier I get the expected output.

4

4 回答 4

3

int2147483647 是您平台上的最大值。

2147483648 == 0x80000000 与 -2147483648 具有相同的二进制表示,这就是你得到这个结果的原因。

于 2012-08-28T12:31:40.437 回答
2

将整数转换为较小的有符号类型时,如果值不能在新类型中表示,则行为是实现定义的:

6.3.1.3

当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则保持不变。

[...]

否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。

于 2012-08-28T12:30:25.627 回答
0

在 32 位二进制补码系统上,最大值int通常为:

2147483647

所以

2147483648

是一个long值。

当值不适合有符号类型时,将值转换为有符号类型是实现定义的。

于 2012-08-28T12:33:08.203 回答
0

当您转换为 时int,您(至少在您当前的平台上)转换为 32 位有符号数字。可以存储在该空间中的最大正值是 2147483647。当您添加 1 时,您将翻转到最大的负值,即输出。

当您使用 时long long int,我相信最小宽度是 64 位。您可以轻松地将值 2147483648 保存在该空间中,因此输出与您预期的一样。

于 2012-08-28T12:31:30.620 回答