打印long long int作为int输出负值

时间:2012-08-28 12:29:23

标签: c casting int printf

为什么这个简单的C程序会打印-2147483648

#include <stdio.h>

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

当然,如果我不进行转换并使用%lld作为格式说明符,我会得到预期的输出。

4 个答案:

答案 0 :(得分:3)

2147483647是您平台上int的最大值。

2147483648 == 0x80000000具有与-2147483648相同的二进制表示形式,这就是您获得该结果的原因。

答案 1 :(得分:2)

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

  

6.3.1.3

     

当整数类型的值转换为另一个整数类型时   除了_Bool之外,如果值可以用新类型表示,那么   没有改变。

     

[...]

     

否则,新类型已签名且无法表示该值   在里面;要么结果是实现定义,要么是   提出了实现定义的信号。

答案 2 :(得分:0)

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

使用long long int时,我认为最小宽度为64位。您可以轻松地在该空间中保存值2147483648,因此输出正如您所期望的那样。

答案 3 :(得分:0)

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

2147483647

所以

2147483648

long值。

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