这是我的程序代码。
#include <stdio.h>
int main() {
int number;
printf("Enter an integer: ");
scanf("%d", &number);
printf("You entered: %d", number);
return 0;
}
如果我输入一个整数:12345678912345678
结果显示:1578423886
为什么会这样?
答案 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
中提到的结果(低位相同且更高被丢弃)