【问题标题】:java maximum value of intjava int的最大值
【发布时间】:2013-10-04 16:05:27
【问题描述】:

来自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 并抛出异常,因为在 int 中不允许使用 2147483648

但是当我在上面运行程序时它会运行(因为无限循环),而不是将值增加到2147483648,分配给i的值是-2147483648,并且值每次递减@ 987654331@.

样例运行(修改类后)

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

答案/提示将不胜感激。

【问题讨论】:

    标签: java loops infinite


    【解决方案1】:

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

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

    来自section 15.18.2 of the JLS

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

    【讨论】:

    • 感谢您的回答。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这称为整数溢出。整数值的算术运算从不抛出异常,这不仅仅是 Java 的事情。

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

      【讨论】:

        【解决方案4】:

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

        Section 4.2.2. Integer Operations

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

        【讨论】:

          【解决方案5】:

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

          • Java 中如何表示整数(以何种二进制数表示)?
          • 如果将最大可能的双空气数加 1 会发生什么?

          【讨论】:

            猜你喜欢
            • 2010-12-23
            • 1970-01-01
            • 1970-01-01
            • 2022-08-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多