3

来自 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值增加i1 并抛出异常,因为.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

答案/提示将不胜感激。

4

5 回答 5

13

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

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

JLS 的第 15.18.2 节

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

于 2013-09-28T11:18:20.220 回答
4

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

于 2013-09-28T11:18:25.353 回答
2

这称为整数溢出。整数值的算术运算永远不会引发异常,这不仅仅是 Java 的事情。

最小值和最大值仅用于决定 anint是否足以满足您的计算。

于 2013-09-28T11:19:13.030 回答
2

在 Java 中,数值的下溢和溢出是关闭的(静默)。在下溢和上溢事件期间,Java 会继续对数值范围进行递增/递减。

第 4.2.2 节。整数运算

整数运算符不以任何方式指示上溢或下溢。

于 2013-09-28T11:20:18.680 回答
1

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

  • Java中如何表示整数(以何种二进制数字表示形式)?
  • 如果将 1 加到可能的最高双空气数上会发生什么?
于 2013-09-28T11:19:45.330 回答