【Java筆記】為什麼資料範圍最大值加一等於最小值
在程式中有時候不小心將最大數值加1,我們會得到一個負數,這個負數就是這種資料型別的最小值。
下面看一個示例:
public class Number { public static void main(String[] args) { System.out.println("最大的整數:" + Integer.MAX_VALUE); System.out.println("最大的整數(二進位制):" + Integer.toBinaryString(Integer.MAX_VALUE)); System.out.println("最小的整數:" + Integer.MIN_VALUE); System.out.println("最小的整數(二進位制):" + Integer.toBinaryString(Integer.MIN_VALUE)); System.out.println(); long num1 = Integer.MAX_VALUE + 1; System.out.println("最大的數" + Integer.MAX_VALUE + "加一等於" + num1); long num2 = 2147483647L + 1; System.out.println("在運算過程中強制型別轉換"); System.out.println("最大的數" + Integer.MAX_VALUE + "加一等於" + num2); } }
執行結果:
最大的整數:2147483647
最大的整數(二進位制):1111111111111111111111111111111
最小的整數:-2147483648
最小的整數(二進位制):10000000000000000000000000000000
最大的數2147483647加一等於-2147483648
在運算過程中強制型別轉換
最大的數2147483647加一等於2147483648
最大的整數:2147483647
最大的整數(二進位制):1111111111111111111111111111111
最小的整數:-2147483648
最小的整數(二進位制):10000000000000000000000000000000
最大的數2147483647加一等於-2147483648
在運算過程中強制型別轉換
最大的數2147483647加一等於2147483648
從結果可以看出:最大的整數加一確實變成了最小的整數,從它們的二進位制形式更可以明顯的看出。計算機內部進行計算的時候是以二進位制的補碼形式進行加法運算的。很顯然,最大的數01111111111111111111111111111111+1=10000000000000000000000000000000,這裡的10000000000000000000000000000000是-2147483648的補碼形式。
如果在運算過程中我們強者將資料型別轉換成儲存容量更大的資料型別,則不會出現這一變成負數這樣的結果。2147483647L + 1是long型的2147483647+1這樣就不會溢位變成負數。
此外,還需要注意的是在Java和C#中int是32位,long是64位,我們這樣轉換沒有問題。但是在C++語言中short、int和long的位數和作業系統有關。我們只能說short<=int<=long,當然兩個等號不會同時成立。所以有時候我們會看到long long這樣的寫法,long long是比long型別容量更大的整形。在VC++中long long也寫作_int64。
原文:https://blog.csdn.net/theonegis/article/details/43493561