Java中预期无限运行的for循环异常输出负数,是什么原因导致的?
原因分析
该现象是Java int类型的有符号整数溢出导致的,具体逻辑如下:
- Java中
int是32位有符号整数,取值范围固定为-2147483648到2147483647,底层采用补码规则存储。 - 循环变量
x从10开始持续自增,当x达到最大值2147483647后,再执行x++会触发上溢,数值会绕回至int的最小值-2147483648。 - 此时
x > 0的循环判断条件不再成立,循环直接终止,并不会无限运行。 - 累加变量
sum在循环过程中也会多次超过int的最大值触发溢出,最终按补码规则计算得到负数结果-1073741869,属于溢出后的正常输出。
补充说明
如果需要实现无限制的累加逻辑,可以将变量类型替换为BigInteger避免溢出;如果只是要实现无限循环,直接使用for(;;)或者while(true)即可。
内容的提问来源于stack exchange,提问作者CopperCleric
相关产品推荐
相关产品推荐

