2013-09-28 36 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

的整数运算符不表明任何 方式溢或下溢。