2016-07-25 36 views
8

在Java下面为什么是它下面的代码中表现不同的Java 1.6和1.7

下面
public class Test16Jit { 
    public static void main(String[] s) { 
     int max = Integer.MAX_VALUE; 
     int i = 0; 
     long li = 0; 
     while (i >= 0) { 
      i++; 
      li++; 
      if (i > max) { 
       System.out.println("i is : " + i); 
       System.out.println("max is : " + max); 
       System.out.println("Woo!! something really went wrong"); 
      } 
     } 
     System.out.println("Value of i: " + i); 
     System.out.println("Total # of iterations: " + li);  
    } 
} 

输出码1.7倍

Value of i: -2147483648 
Total # of iterations: 2147483648 
下面

在产出的Java 1.6倍

i is : 2147483636 
max is : 2147483647 
Woo!! something really went wrong 
Value of i: -2147483648 
Total # of iterations: 2147483648 

是否有这种行为的原因?

另外,如果我改变

int max = Integer.MAX_VALUE; -> final int max = Integer.MAX_VALUE; 

它的行为在1.6倍完全相同和1.7倍

+1

你是否从简单的代码'int max = Integer.MAX_VALUE; int i = 2147483636; System.out.println(i> max);'? –

+1

@AndyTurner我还没有测试,但我猜这应该是一个JIT错误。 – shmosel

+0

打印false @AndyTurner –

回答

7

这似乎是一个家庭的与此相关的一个所造成的JIT编译错误这样的例子很多(我选择这一个由于代码相似性,可以随意浏览别人 - 他们是很有趣!):

http://bugs.java.com/view_bug.do?bug_id=6196102

评估

问题是为了准备 循环转换而进行循环出口测试的规范化。

do while (++i <= limit)

成为

do while (++i < limit+1)

当限MAXINT这是不正确的。

一些问题在1.7中修复,这可以解释您的结果。

+1

很好找。不过,我仍然在为自己的头脑稍微摸索一下,为什么这会在整数溢出的最后发生? –

相关问题