C打印整数的程序(由用户输入)当数字为BIG时输出错误

时间:2018-03-16 19:25:11

标签: c

这是我的程序代码。

#include <stdio.h>

int main() {
   int number;

   printf("Enter an integer: ");

   scanf("%d", &number);

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

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

为什么会这样?

3 个答案:

答案 0 :(得分:1)

问题是,在您运行的系统上,int不足以存储您尝试输入的整数(限制是特定于体系结构的,并且可以通过INT_MAX)。如果您将变量定义为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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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