Java 整數溢出

int 類型在 Java 中是“有符號”的。所謂“有符號”就是有正負。
在計算機中用二進制表示所有的信息,這個符號的區別就看首位。
首位如果是 0,就是正的,1 就是負的。正與負的區別也因此就在於取反加一。這不僅在 Java,在任何語言中都是這樣的。
所謂數值溢出就會出現這個現象。

Java 中的 int 總共就 32 位,正數上限的情況首位也只能是 0,其他位都可以是 1(就是 2^31-1 的情況)。但是如果正數過大了,例如 2^31,計算機不得不把首位變成 1,並且很快就忘了這是溢出情況,把它按照正常的方式輸出了,於是就成了負的。其實也不能怪它,它沒有辦法自動處理超過溢出的情況,因爲 32 位是固定的,它不能因爲溢出而臨時擴展到 33 位之類的。

2^31 - 1 = 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647
2^31 = 2^31 - 1 + 1 = 1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648

以上是負數的情況。溢出變成 0 的話道理也一樣。你想如果一個數大到最後 32 位都是 0 了,那計算機只能把它認作 0。這種情況有很多,例如 2^32 就是一共 33 位,首位 1,後面 32 位都是 0。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章