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

roa*_*rox 1 java integer loops

有人可以解释为什么这个代码是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++);
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*kar 8

  • 该值是Integer.MAX_VALUE从变化2147483647-2147483648Integer.MIN_VALUE的溢出时.
  • 当算术运算尝试创建超出数据类型值范围的值时,会发生整数溢出.
  • 在java中有整数范围-21474836482147483647.
  • 在for循环中,当i变为2147483647i ++操作时,将尝试将其值增加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);
}
Run Code Online (Sandbox Code Playgroud)

您将看到以下输出.

2147483645
2147483646
2147483647
-2147483648
-2147483647
-2147483646
Run Code Online (Sandbox Code Playgroud)