以最簡單(位數最短)的byte舉例
按照通常直覺,正負數不是對稱的麽,為什麽負數最小不是-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
接下來繼續解釋: