java的最大值为int

时间:2013-09-28 11:16:19

标签: java loops infinite

来自java文档int has a minimum value of -2,147,483,648 and a maximum value of 2,147,483,647 (inclusive)

我有一个班级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应将i的值增加1并抛出异常,因为2147483648中不允许使用int

但是当我在程序之上运行时它会运行(因为无限循环),而不是将值递增到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

答案/提示将不胜感激。

5 个答案:

答案 0 :(得分:12)

  

根据我的知识++我应该将i的值递增1并抛出异常,因为int中不允许使用2147483648。

您的理解不正确。整数算术在Java中静默溢出。

来自section 15.18.2 of the JLS

  

如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的二进制补码格式所示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同。

答案 1 :(得分:4)

您遇到过称为整数溢出的情况: http://en.wikipedia.org/wiki/Integer_overflow

答案 2 :(得分:2)

这称为整数溢出。对整数值的算术运算永远不会抛出异常,这不仅仅是Java。

最小值和最大值仅用于确定int是否足以进行计算。

答案 3 :(得分:2)

在java下溢和数值溢出都关闭(无声)。在下溢和溢出事件期间,Java会持续递增/递减数值的范围。

Section 4.2.2. Integer Operations

  

整数运算符不表示任何溢出或下溢   方式。

答案 4 :(得分:1)

我不会给出确切的答案,但请考虑一下:

  • 如何用Java表示整数(以什么样的binair数字表示)?
  • 如果你给最高的binair数加1,会发生什么?