【问题标题】:Why does the loop iterate beyond Integer.MAX_VALUE?为什么循环迭代超出 Integer.MAX_VALUE?
【发布时间】:2016-10-05 04:17:28
【问题描述】:

有人能解释为什么这段代码在 Java 7,8 上是一个无限循环吗?循环应该在i = Integer.MAX_VALUE + 1 时停止,但它似乎拒绝了限制。为什么会这样?

public static void main(String[] args) {
    for (int i = Integer.MAX_VALUE - 100; i <= Integer.MAX_VALUE; i++);
}

【问题讨论】:

  • 您希望int 何时大于int 的最大可能值?

标签: java loops integer


【解决方案1】:
  • Integer.MAX_VALUE 的值从 2147483647 更改为 -2147483648Integer.MIN_VALUE当它溢出时。
  • Integer overflow 发生在算术运算尝试创建超出数据类型值范围的值时。
  • 在 Java 中,整数的范围从 -21474836482147483647
  • 在 for 循环中,当 i 变为 2147483647 时,i++ 操作将尝试将其值增加 1,这是不可能的,因为范围仅到 2147483647
  • 所以它的值不是2147483648,而是回到起始值,即-2147483648
  • 因此i &lt;= Integer.MAX_VALUE 总是变成true
  • 由于条件永远不会变为false,因此循环将一直持续到无穷大。

您可以通过简单地编写如下代码来检查值溢出。

for (int i = Integer.MAX_VALUE - 100; i <= Integer.MAX_VALUE; i++){
        System.out.println(i);
}

您将看到以下输出。

2147483645
2147483646
2147483647
-2147483648
-2147483647
-2147483646

【讨论】:

    【解决方案2】:

    看看

     i <= Integer.MAX_VALUE
    

    这总是正确的。如果 i = Integer.MAX_VALUE+1 则溢出,变为负数。

    这样做:

     System.out.println(Integer.MAX_VALUE+1)
    

    【讨论】:

      【解决方案3】:

      因为当i 达到等于Integer.MAX_VALUE 然后它变成Integer.MAX_VALUE + 1 变成负数

      会更好

      for (long i = Integer.MAX_VALUE - 100; i <= Integer.MAX_VALUE; i++)
      

      【讨论】:

        【解决方案4】:

        您希望循环一直运行到i &lt;= Integer.MAX_VALUE,并在它变为Integer.MAX_VALUE + 1(即2147483648)时立即停止。但是,不会发生,因为每当您向 Integer.MAX_VALUE 添加一些内容时,例如 x,计算采用以下形式:

        Integer.MIN_VALUE + x - 1;
        

        由于int 不能存储超过2147483647(当然也不能超过-2147483648),所以这样做是为了确保没有溢出。所以,在2147483647 之后,i 变成了-2147483648,这显然小于+2147483647,因此,这是一个无限循环

        如果您希望循环在该范围内迭代(即,您只想使用值),您可以使用longint 之间的类型转换,如下所示:

        for(long i = (long)Integer.MAX_VALUE - 100; i<= (long)Integer.MAX_VALUE; i++){
            //to use i as an int, type cast from (long) to (int)
        }
        

        【讨论】:

        • @ScaryWombat 你是对的。我只是太有道德了:P
        猜你喜欢
        • 2021-09-07
        • 2017-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        • 2019-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多