long long int a;
scanf("%lld",&a);
printf("n : %lld\n",a);
输入是 9223372036854775808 (LLONG_MAX + 1)
但输出是 9223372036854775807 (LLONG_MAX)
x64 GNU/Linux 和我使用 GCC 编译器
最佳答案
scanf
中的溢出会触发未定义的行为。
但是,许多流行的 scanf
实现在内部使用 strto...
组中的函数将字符串转换为实际数字。 (或者,更准确地说,它们使用与 strto...
函数相同的低级实现原语。)strto...
函数生成目标类型的最大值溢出。该实现的副作用是您在测试中观察到的。显然使用了 strtoll
,它在正溢出时产生 LLONG_MAX
。
但是你不应该依赖它,因为行为是未定义的。
关于c - 为什么long long int不会溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27795024/