簡體   English   中英

為什么循環迭代超出 Integer.MAX_VALUE?

[英]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++);
}
  • Integer.MAX_VALUE值在溢出時從2147483647變為-2147483648Integer.MIN_VALUE
  • 當算術運算嘗試創建超出數據類型值范圍的值時,會發生整數溢出
  • 在 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

看着

 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 ,因此,它是一個無限循環

如果您希望循環在該范圍內迭代(即,您只想使用這些值),您可以使用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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM