You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:54:05