为什么循环迭代超过Integer.MAX_VALUE?

时间:2016-10-05 04:17:28

标签: java loops integer

有人可以解释为什么这段代码在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++);
}

4 个答案:

答案 0 :(得分:8)

  • Integer.MAX_VALUE2147483647更改为 -2147483648 Integer.MIN_VALUE,当它溢出时。
  • 当算术运算尝试创建超出数据类型值范围的值时,会发生
  • Integer overflow
  • 在java中,整数范围从-21474836482147483647
  • 在for循环中,当i变为2147483647时,i ++操作将尝试将其值增加1,这是不可能的,因为范围仅为2147483647
  • 因此,它不会将其值设为2147483648,而是返回起始值,即-2147483648
  • 因此i <= 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

答案 1 :(得分:3)

看看

$(this).parents('.divider:first').siblings('div').slideToggle("slow");

这总是如此。如果i = Integer.MAX_VALUE + 1则会溢出,并变为负数。

这样做:

 i <= Integer.MAX_VALUE

答案 2 :(得分:3)

因为当i达到Integer.MAX_VALUE时,它变为Integer.MAX_VALUE + 1变为负数

最好是

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

答案 3 :(得分:3)

您希望循环一直运行到i <= Integer.MAX_VALUE,并在它变为Integer.MAX_VALUE + 1后立即停止,即2147483648。但是,没有发生因为无论何时向Integer.MAX_VALUE添加内容,例如 x ,计算都采用以下形式:

Integer.MIN_VALUE + x - 1;

由于int无法存储超出2147483647(当然超过-2147483648),所以这样做是为了确保没有溢出。因此,在2147483647之后,我变为-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)
}