【问题标题】:Printing a long long int as int outputs negative value [closed]打印 long long int 作为 int 输出负值
【发布时间】:2012-08-28 12:29:22
【问题描述】:

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

#include <stdio.h>

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

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

【问题讨论】:

标签: c casting int printf


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    6.3.1.3

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

    [...]

    否则,新类型有符号,值无法表示 在里面;结果要么是实现定义的,要么是 引发了实现定义的信号。

    【讨论】:

    • 在哪里可以了解“已定义”行为?
    • 只有溢出才可以:(int) (unsigned long long) 3.
    • @nightcracker 好电话,修正了措辞。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      2147483647
      

      所以

      2147483648
      

      是一个long 值。

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

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-22
        • 1970-01-01
        相关资源
        最近更新 更多