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