1、為什麼Java中int型資料取值範圍是[-2^31,2^31-1],多麼神奇的問題,網上找了很多,找不到點子上,自己瞎總結一下子。
1.1、int是Java中的8種基本類型之一,一個int值占4個位元組byte,一個位元組是8位bit(即8個二進制位),是以int型占32位。其中第一位是标志位,标志位為0表示正數,标志位為1表示負數,剩餘的31位是用來表示數字部分的。
1.2、在計算機中,數值一律用補碼來表示和存儲,原因在于,使用補碼,可以将符号位和數值域統一處理。同時,加法和減法也可以統一處理。
1)、正整數的補碼是其二進制表示,與原碼相同。正數的反碼與其原碼相同,正數的原碼、反碼、補碼都是相同的。
例:+9的補碼是00001001。注意:這個+9的補碼是用8位2進制來表示的,補碼表示方式很多,還有16位二進制補碼表示形式,以及32位二進制補碼表示形式,64位進制補碼表示形式等。每一種補碼表示形式都隻能表示有限的數字。
2)、求負整數的補碼,将其原碼除符号位外的所有位取反(0變1,1變0,符号位為1不變)後加1。即負數的反碼是對正數逐位取反,符号位保持為1。負數的反碼等于原碼符号位不變,其餘各位逐位取反,補碼等于反碼加1。
例:-5對應正數5(00000101),那麼-5(10000101),→所有位取反(11111010)→加1(11111011),是以-5的補碼是(11111011)。
3)、0的補碼,數0的補碼表示是唯一的。
例:[+0]補=[+0]反=[+0]原=00000000,[-0]補=11111111+1=00000000。
2、為什麼Java中int型資料取值範圍是[-2^31,2^31-1]。即-2147483648 ~ 2147483647。
2.1、因為int型資料類型是有符号位的,是以這裡拆分為兩部分,一部分是正數,一部分是負數進行觀察。
1)、正數的範圍是從1 ~ 2147483647的。
例:1的原碼為0000 0000 0000 0000 0000 0000 0000 0001。2147483647的原碼為0111 1111 1111 1111 1111 1111 1111 1111。是以最大的正整數是2147483647。這裡簡單計算一下,為什麼原碼為0111 1111 1111 1111 1111 1111 1111 1111的最大的正整數是2147483647。當為1位時0000 0000 0000 0000 0000 0000 0000 0001,最大值的二進制就是1,也就是十進制的1 = 1,也就是2^1 - 1,當為2位時0000 0000 0000 0000 0000 0000 0000 0011,最大值的二進制是11,也就是十進制的1 + 2 = 3,也就是2^2 - 1,同理,8位時0000 0000 0000 0000 0000 0000 1111 1111,最大值的二進制是8個1,也就是1111 1111,算下來的十進制數值就是1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255,也就是2^8 - 1,依此類推即可。
2)、負數的範圍是從-1 ~ 2147483648的。
例:-1的原碼為1000 0000 0000 0000 0000 0000 0000 0001,
反碼為1111 1111 1111 1111 1111 1111 1111 1110,
補碼為1111 1111 1111 1111 1111 1111 1111 1111。
-2147483647的原碼為1111 1111 1111 1111 1111 1111 1111 1111,
反碼為1000 0000 0000 0000 0000 0000 0000 0000,
補碼為1000 0000 0000 0000 0000 0000 0000 0001。
那麼為什麼負數的範圍是從-1 ~ 2147483648的。因為要看0了。
3)、在二進制中,0有兩種表方法。+0的原碼為0000 0000 0000 0000 0000 0000 0000 0000,-0的原碼為1000 0000 0000 0000 0000 0000 0000 0000,因為0隻需要一個,是以把-0拿來當做一個最小的數-2147483648。-2147483648的補碼表示為1000 0000 0000 0000 0000 0000 0000 0000,在32位沒有原碼。由于1000 0000 0000 0000 0000 0000 0000 0000本身代表的是2147483648(即2的32-1次方),再加上最高位為1,那麼就是個負數,再加上所有的二進制表示又少了一個,是以,1000 0000 0000 0000 0000 0000 0000 0000就順理成章的成了-2147483648,當然,1000 0000 0000 0000 0000 0000 0000 0000是補碼,它沒有原碼和反碼。
4)、-2147483648的補碼表示為1000 0000 0000 0000 0000 0000 0000 0000,在32位沒有原碼。注意,這個補碼并不是真正的補碼,-2147483648真正的補碼是1 1000 0000 0000 0000 0000 0000 0000 0000,在Java的int基本資料類型中溢出了。是以帶符号32位int類型整數為-2147483648~2147483647