【问题标题】:C Program to Print an Integer (Entered by the User) Wrong Output Coming When The number is BIG [duplicate]C程序打印一个整数(由用户输入)当数字很大时输出错误[重复]
【发布时间】:2018-03-17 03:48:35
【问题描述】:

这是我的程序代码。

#include <stdio.h>

int main() {
   int number;

   printf("Enter an integer: ");

   scanf("%d", &number);

   printf("You entered: %d", number);
   return 0;
}

如果我输入一个整数:12345678912345678 结果显示:1578423886

为什么会这样?

【问题讨论】:

  • 不同的变量类型有最小值和最大值。您输入的数字大于 int 的最大值。
  • 12345678912345678 是一个 54 位数字。在十六进制中它是0x2bdc545e14d64e。有趣的是15784238860x5e14d64e
  • 链接副本中的答案和此处的答案都不完全正确,因为它是 ISO/IEC 9899:2011 第 7.21.6.2 节第 10 节中所述的“未定义行为”。一切都可能发生,它甚至可能会杀死你的猫。这就是为什么您必须始终检查scanf的返回!

标签: c


【解决方案1】:

问题是在您运行的系统上,int 不够大,无法存储您尝试输入的整数(限制是特定于体系结构的,可以通过 @987654322 检查@)。如果您将变量定义为 long long,它将能够保存更大的值(long long 在大多数常见架构上是 64 位),因此:

#include <stdio.h> 

int main() {
    long long number;

    printf("Enter an integer: ");
    scanf("%lld", &number);

    printf("You entered: %lld", number);
    return 0; 
}

输出:

Enter an integer: 12345678912345678
You entered: 12345678912345678

【讨论】:

    【解决方案2】:

    发生这种情况是因为任何编程语言的数据类型都有限制,因此您不能简单地将任何数字放入整数数据类型。可能对于您的测试,整数数据类型的限制是 2.147.483.647,如果您想接收更大的数字,您将不得不切换到 long 或 unsigned long,这完全取决于您的需求,并且当涉及到真正的处理时大数字可能您需要将其读取为字符串,然后将其解析为一个特殊的结构或类,而不是处理这个非常大的数字。

    【讨论】:

      【解决方案3】:

      发生这种情况是因为在系统上,如果值不适合 int,则转换结果是实现定义的。 (或者,从 C99 开始,它可以引发实现定义的信号,但我不知道有任何编译器会真正做到这一点。)通常发生的是 高阶位被丢弃,但你不应该依赖它。 (无符号类型的规则不同;将有符号或无符号整数转换为无符号类型的结果是明确定义的。)

      由于这种丢弃,您会得到评论中提到的结果12345678912345678 is a 54-bit number. In hex it's 0x2bdc545e14d64e. Interestingly enough 1578423886 is 0x5e14d64e(低位相同,高位被丢弃)

      【讨论】:

        猜你喜欢
        • 2014-10-30
        • 1970-01-01
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多