32位有符號數的取值范圍


參考:https://blog.csdn.net/luotoo/article/details/106615367

按照通常直覺,正負數不是對稱的么,為什么負數最小不是-127,又或正數最大是128呢?

byte類型是8bit表示,那么可以表達的狀態就有2^8=256個,如果表示無符號整數可以表達最小2進制00000000到最大2進制11111111(=255)共256個數字。

但是JAVA中整型都是有符號,區分就看第一個bit位,第一個bit如果是0則是正數,如果為1則是負數。看到這里就有疑問了,如果第一個bit位表示符號,那么剩下的7位能表示的范圍只能是0到2^7-1=127了,豈不是全部數據范圍就是-127~127(包括0)共255個數字,先前我們說了,8bit可以表達256個狀態,怎么少了一個呢?

原來正0(00000000)和負0(100000000)都是0,計算意義上看也就是重復表達同樣的意義,浪費了一個狀態表示。為了不浪費資源,盡可能多的存儲數據范圍,先賢發明了補碼表示負數 ,即一個負數可以用對應的正數的補碼表示,而補碼=(正數)原碼取反(=反碼)+1

現在我們用定義一個byte變量值是-127,內存如何存儲呢?即求補碼
1.127的2進制原碼=01111111,
2.求反碼=源碼取反=10000000
3.反碼加1后變成10000001,這就是-127的2進制表示

OK,現在反過來看,計算機指令看到一個byte類型變量值是10000001,怎么得到-127呢?
就是上面求補碼的逆向過程,
1.發現第一bit位是1,知道這是補碼,是負數
2.補碼減1 得出反碼=10000000
3.反碼取反得到原碼=01111111,這就是正數127的2進制表示
4.因此10000001的值就是-127

接下來繼續解釋:

byte的最大值為什么是127?
因為第一個bit是符號位,那么正數最大只能是01111111=2^7 - 1 = 127

0的補碼和原碼是一樣的
按照上面補碼的求解過程
0的原碼=00000000→反碼11111111 + 1→補碼00000000(最高進位丟棄),嗯,也就是說正負0只用一個狀態表示。

為什么byte最小值是-128?
我們已經了解,每一個正數有一個對應的補碼表示負數,但是通過上面的分析,我們發現-127~127(包括0也沒有重復表示)共255個狀態,還有一個狀態10000000沒有利用,它是多少呢?
1.發現第一bit位是1,知道這是補碼,是負數
2.補碼減1 得出反碼=01111111
3.反碼取反得到原碼=10000000=(128)(我們說原碼時,並沒有提符號位,僅僅是2進制表示)
注意補碼和原碼一致,似乎可以即表示128,也可表示-128,但注意與前面的定義保持一致,也為方便計算機識別處理,首位是1即是負數,因此只能是-128了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM