有人可以解释为什么这段代码在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++);
}
答案 0 :(得分:8)
2147483647
更改为
-2147483648
Integer.MIN_VALUE,当它溢出时。-2147483648
到2147483647
。 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
,因此是无限循环。
如果您希望循环在该范围内迭代(即,您只想使用这些值),您可以使用long
和int
之间的类型转换,如下所示:
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)
}