2016-07-25 34 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

很好找。不過,我仍然在爲自己的頭腦稍微摸索一下,爲什麼這會在整數溢出的最後發生? –

相關問題