爲什麼Java中int型數據取值範圍是[-2^31,2^31-1]

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
 

作者:別先生

博客園:https://www.cnblogs.com/biehongli/

如果您想及時得到個人撰寫文章以及著作的消息推送,可以掃描上方二維碼,關注個人公衆號哦。

 

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