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

为何两个Integer.MAX_VALUE相加返回-2?Java技术疑问求助

为什么两个Integer.MAX_VALUE相加没抛出异常反而得到-2?

你好Petar,这个问题其实和Java处理整数溢出的机制直接相关,咱们来拆解清楚:

1. Java的整数溢出是「静默处理」的

Java里的int是32位有符号整数,取值范围是-2^31到2^31-1(对应Integer.MIN_VALUE到Integer.MAX_VALUE)。当运算结果超出这个范围时,Java不会自动抛出异常,而是直接对结果做补码截断——简单说就是只保留结果的低32位,高位直接丢弃,用剩余的部分作为最终值。

2. 具体计算过程拆解

Integer.MAX_VALUE的值是2147483647(也就是2^31 - 1),两个这个值相加的话:

2147483647 + 2147483647 = 4294967294

把4294967294转换成32位二进制是11111111 11111111 11111111 11111110。由于32位有符号整数的最高位是符号位(0代表正数,1代表负数),这个二进制数的最高位是1,所以会被解析成负数。转换成十进制后就是-2,这就是你看到的输出结果。

3. 如何让溢出时抛出异常?

如果希望在整数溢出时触发异常,可以用Java 8及以上版本Math类提供的精确运算方法,比如Math.addExact(int x, int y):

public int sum() {
    return Math.addExact(Integer.MAX_VALUE, Integer.MAX_VALUE);
}

这时再运行你的测试用例,就会抛出ArithmeticException: integer overflow,符合你最初的预期。

内容的提问来源于stack exchange,提问作者Petar Petrov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:16:55