2013-09-28 61 views
2

來自java文檔int has a minimum value of -2,147,483,648 and a maximum value of 2,147,483,647 (inclusive)java的最大值int

我有一個類Test.java

public class Test 
{ 
    public static void main(String[] args) 
    { 
     int i=2147483647; //max positive value an int can store 
     for(;;) 
     { 
      System.out.println(++i); 
     } 
    } 
} 

按我的知識++i應當由1和拋出異常增加的i的價值,因爲2147483648int不允許的。

但是當我運行上面的程序它會運行(因爲無限循環)和,而不是價值增加至2147483648,分配給i-2147483648和值由1每次遞減。

樣品運行(經過修改類)

public static void main(String[] args) 
{ 
    int i=2147483647; 
    for(;;) 
    { 
     System.out.println(++i); 
     System.out.println(++i); 
     System.out.println(++i); 
     System.out.println(++i); 
     System.out.println(++i); 
     break; 
    } 
} 

輸出:

-2147483648 
-2147483647 
-2147483646 
-2147483645 
-2147483644 

答案/提示將不勝感激。

回答

12

根據我的知識++我應該增加我的值1並拋出異常,因爲在int中不允許2147483648。

你的理解不正確。整數算術在Java中靜靜地溢出。

section 15.18.2 of the JLS

如果整數加法溢出,那麼結果是數學和的低位比特作爲在一些足夠大的二進制補碼格式表示。如果發生溢出,則結果的符號與兩個操作數值的數學和的符號不同。

+0

感謝您的回答。 – Bhushan

2

這被稱爲整數溢出。對整數值進行算術運算不會拋出異常,這不是一個純Java的東西。

最小值和最大值僅供您決定int是否足以滿足您的計算。

1

我不會給出確切的答案,但可以這樣考慮:

  • 如何爲整數的Java來表示(在什麼樣的binair數字表示的)?
  • 如果您將最高可能的binair數加1,會發生什麼情況?
2

在java下溢和數值溢出關閉(無聲)。在下溢和溢出事件期間,Java會一直繼續遞增/遞減數值範圍。

Section 4.2.2. Integer Operations

的整數運算符不表明任何 方式溢或下溢。