为什么-1的补码是全1(11111111)?-128的补码是10000000?
首先需要知道:二進制補碼表示的正數實際上左側有無限多個0,而負數有無限多個1.只是為了適應硬件的寬度,二進制表示的數的前導位被隱藏了。
舉例
下面看一下64位的 ?4ten-4_{ten}?4ten?的補碼(以64位機器(機器里面存的是補碼)為例):
00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two=[4]補00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100_{two}=[4]_{補}00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two?=[4]補?
11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100two=[?4]補11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100_{two}=[-4]_{補}11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100two?=[?4]補?
下標two表示二進制,下標ten表示十進制。
我們把[?4]補[-4]_{補}[?4]補?和[4]補[4]_{補}[4]補?相加會得到什么呢?
[?4]補+[4]補=00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two+11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100two=1,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two[-4]_{補}+[4]_{補}=00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100_{two}\\+11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100_{two}\\=1,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100_{two} [?4]補?+[4]補?=00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two?+11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111100two?=1,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000100two?
我們發現 64位補碼相加得到2642^{64}264!
下面求8位的 ?4ten-4_{ten}?4ten?的補碼
已知 有符號數 ?4ten=10000100two-4_{ten}=10000100_{two}?4ten?=10000100two?,
根據口訣:負數的補碼=負數的原碼取反(符號位不變,數據位取反)+1
可以得到:[?4]補=11111011two+00000001two=11111100two[-4]_{補}=11111011_{two}+00000001_{two}=11111100_{two}[?4]補?=11111011two?+00000001two?=11111100two?,
而4ten4_{ten}4ten?的補碼仍然是原碼,即[4]補=00000100two[4]_{補}=00000100_{two}[4]補?=00000100two?,
我們把[?4]補[-4]_{補}[?4]補?和[4]補[4]_{補}[4]補?相加會得到什么呢?
[?4]補+[4]補=11111100two+00000100two=1,00000000[-4]_{補}+[4]_{補}=11111100_{two}+00000100_{two}=1,00000000[?4]補?+[4]補?=11111100two?+00000100two?=1,00000000
我們發現 8位補碼相加得到282^{8}28!
歸納
二進制補碼得名于下述規則:一個n位的數與其n位的相反數做無符號加法,結果為2n2^n2n,因此,x的相反數(或相補數)-x 等于2n?x2^n-x2n?x,或叫“二進制補碼”。
以n=8位為例,1的二進制表示為00000001,則 -1的二進制補碼可以由上面的公式寫出來
[?1]補=2n?1=28?1=1,00000000?00000001=11111112?00000001=11111111[-1]_補=2^n-1=2^8-1=1,00000000-00000001=11111112-00000001=11111111[?1]補?=2n?1=28?1=1,00000000?00000001=11111112?00000001=11111111
注:這里11111112僅僅是方便計算,實際二進制中逢二進一,還是100000000.
同樣的,我們來看-128的情況。
對于128ten=27=10000000128_{ten}=2^7=10000000128ten?=27=10000000 ,這里的n=8,根據補碼的定義:
[?128]補=28?128=1,00000000?10000000=11111112?10000000=10000000[-128]_{補}=2^8-128=1,00000000-10000000=11111112-10000000=10000000[?128]補?=28?128=1,00000000?10000000=11111112?10000000=10000000
綜上,求1個負數(-x)的補碼,只需要用2n?x2^n-x2n?x即可,這里的n表示這個負數的二進制位數。注意這里x是正數
后記:這個問題在《計算機組成與設計-硬件/軟件接口》一書中有詳細的解釋。
總結
以上是生活随笔為你收集整理的为什么-1的补码是全1(11111111)?-128的补码是10000000?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 要你命3000List31
- 下一篇: GRE核心词汇助记与精练-List10感