为何两个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
相关产品推荐
相关产品推荐

