c - 为什么long long int不会溢出?

标签 c linux long-integer

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/

相关文章:

C - 从一个 int 中获取一个字符串

linux - sed 任何整个单词搜索和替换

c - 为什么 C 在对大于 10 位的整数进行运算时会输出乱码结果?

linux - 如何检测新的磁盘插件?

linux - ldd 不适用于动态链接的二进制文件

c++ - C 和 C++ 中的 1LL 或 2LL 是什么?

java - 在 Java 中长期被视为 32 位?

c - 不明白修改源代码后如何从运单扫描

c - 使用位封装来模拟 c 中 3d 数组的功能

c++ - C/C++中的主题挖掘算法