當前位置:編程學習大全網 - 源碼下載 - 有符號整型的數據範圍為什麽負數比正數多壹個

有符號整型的數據範圍為什麽負數比正數多壹個

在JAVA中,有符號整型(long,int,short,byte)類型能表示的數據範圍總是負數個數比正數要多壹個,為什麽?

以最簡單(位數最短)的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

接下來繼續解釋:

  • 上一篇:夢見開車開車遇見小偷
  • 下一篇:最新超算第壹名“神威太湖之光”到底有多強
  • copyright 2024編程學習大全網