[英]Why does the loop iterate beyond Integer.MAX_VALUE?
有人可以解釋為什么這段代碼是 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++);
}
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
看着
i <= Integer.MAX_VALUE
這總是正確的。 如果 i = Integer.MAX_VALUE+1 那么它就會溢出,變成負數。
做這個:
System.out.println(Integer.MAX_VALUE+1)
因為當i
達到等於Integer.MAX_VALUE
然后它變成Integer.MAX_VALUE + 1
變成負數
更好的是
for (long i = Integer.MAX_VALUE - 100; i <= Integer.MAX_VALUE; i++)
您希望循環運行到i <= Integer.MAX_VALUE
並在它變為Integer.MAX_VALUE + 1
立即停止,即2147483648
。 但是,這不會發生,因為每當您向 Integer.MAX_VALUE 添加某些內容時,例如x ,計算采用以下形式:
Integer.MIN_VALUE + x - 1;
由於int
不能存儲超過2147483647
(當然也超過-2147483648
),所以這樣做是為了確保沒有溢出。 因此,在2147483647
之后, i 變為-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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.