为什么C语言中int最小值减1会输出最大int值2147483647?
问题复现
对应测试代码如下:
#include<stdio.h> int main(){ int a=-2147483648; a-=1; printf("%d",a); }
以上代码运行后输出为2147483647,原理说明如下:
原理说明
- 32位环境下有符号int类型采用补码存储,取值范围固定为
-2^31(即-2147483648)到2^31 - 1(即2147483647),其中最小值-2147483648对应的补码为0x80000000,最大值2147483647对应的补码为0x7FFFFFFF。 - 你定义的变量a初始值已经是int类型能表示的最小边界值,执行
a -= 1操作时,会触发有符号整数下溢。 - 目前绝大多数编译器的实现中,有符号整数溢出/下溢会按照补码循环回绕的逻辑处理:
0x80000000减1的运算结果为0x7FFFFFFF,正好对应int类型的最大值2147483647,所以最终printf输出该值。
注意:C语言标准明确规定有符号整数溢出属于未定义行为,不同编译器可能有不同处理逻辑,不要在生产代码中依赖这种溢出回绕的特性。
内容的提问来源于stack exchange,提问作者amirm
相关产品推荐
相关产品推荐

