【问题标题】:Why 2147483647+1 run successfully and 2147483648 gives error为什么 2147483647+1 运行成功而 2147483648 给出错误
【发布时间】:2021-03-03 03:53:17
【问题描述】:
int maxAgain = 2147483647+1;
System.out.println(maxAgain);
int maxAgain1 =  2147483648
System.out.println(maxAgain1);

为什么 maxAgain 和 maxAgain1 有区别。

注意:

  • 整数最大值:2147483647
  • 整数最小值:-2147483648

这里 maxAgain 运行成功,maxAgain1 报错。

【问题讨论】:

  • 第一个有效,因为它溢出并导致下一个值,在这种情况下是 -2147483648 但第二个是不允许的,因为您不能为 int 分配一个不在允许的范围。

标签: java integer


【解决方案1】:

因为整数溢出。当它溢出时,下一个值为Integer.MIN_VALUE。每当你给最大的java Integer加上1,它的位符号为0,那么它的位符号就变成1,数字变成负数。

简而言之,这与您越过国际日期变更线时日期发生变化的原因相同:那里存在不连续性。它内置于二进制加法的本质中。

来源:

1 2 3

【讨论】:

    【解决方案2】:

    您的第一行溢出,结果为-2147483648,如running on IdeOne.com 所示。这在correct Answer by Spectric 中有解释。

    Math.addExact

    要在运行时收到此类溢出发生的通知,请使用静态方法Math.addExact。如果您的添加导致整数溢出,则会引发异常,ArithmeticException

            try
            {
                  int result = Math.addExact( 2_147_483_647 , 1 ) ;
                  System.out.println( result ) ;
            }
            catch ( ArithmeticException e )
            {
                 System.out.println( e ) ;
            }
    

    查看代码run live at IdeOne.com

    【讨论】:

      【解决方案3】:

      整数能够存储介于 -2147483648 到 2147483647 之间的任何数字,因为它被指定为 32 位存储。

      您可以改用long 类型,它可以存储-9,223,372,036,854,775,808 到 223,372,036,854,775,807 和 64 位。

      【讨论】:

        猜你喜欢
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 2012-07-17
        • 2015-09-18
        • 1970-01-01
        相关资源
        最近更新 更多