【发布时间】:2011-07-08 04:41:35
【问题描述】:
我注意到一些意外行为(相对于我个人的期望而言是意外的),我想知道是否 JVM 中存在错误,或者这可能是我不了解某些细节的边缘情况究竟应该发生什么。假设我们在 main 方法中有以下代码:
int i;
int count = 0;
for(i=0; i < Integer.MAX_VALUE; i+=2){
count++;
}
System.out.println(i++);
一个天真的期望是这将打印Integer.MAX_VALUE-1,最大的甚至可表示的int。但是,我相信整数算术应该在 Java 中“翻转”,所以将 1 加到 Integer.MAX_VALUE 应该会导致 Integer.MIN_VALUE。由于Integer.MIN_VALUE 仍然小于Integer.MAX_VALUE,因此循环将继续遍历负偶数整数。最终它会回到 0,并且这个过程应该以无限循环的形式重复。
当我实际运行这段代码时,我得到了不确定的结果。打印出来的结果往往是 50 万左右,但确切的值会有所不同。因此,当我认为它应该是一个无限循环时,循环不仅会终止,而且它似乎是随机终止的。怎么回事?
我的猜测是,这要么是 JVM 中的错误,要么是正在进行的许多时髦优化导致了这种预期行为。是哪个?
【问题讨论】:
-
这就是你的主要方法中的全部内容吗?
-
@Michael:只是检查一下没有发生一些时髦的线程。在我的机器上它总是打印出 2147483640,但这仍然出乎意料。
-
我试了 3 次,结果在 300,000 和 500,000 之间 - 所以看起来它是特定于 VM 的(build 1.6.0_24-b07, 32bit linux)
-
程序永远不会在带有 HotSpot 1.6.0_24 的 32 位 Windows XP 上终止
-
Java 从未停止让我惊叹。对 OP +1 和对链接到 Oracle/Sung 错误的答案 +1。我最近最喜欢的是这个:stackoverflow.com/questions/4949057 :)
标签: java jvm compiler-optimization integer-overflow