計(jì)算機(jī)底層均是以二進(jìn)制表示的,數(shù)字也不例外,本文旨在探討一下數(shù)字的原碼、反碼和補(bǔ)碼。
概念
需要聲明的是,本文涉及到的數(shù)字及運(yùn)算均基于8位bit下的值。
原碼
最高位為符號(hào)位,0代表正數(shù),1代表負(fù)數(shù),非符號(hào)位為該數(shù)字絕對(duì)值的二進(jìn)制表示。
如:
127的原碼為0111 1111
-127的原碼為1111 1111
反碼
正數(shù)的反碼與原碼一致;
負(fù)數(shù)的反碼是對(duì)原碼按位取反,只是最高位(符號(hào)位)不變。
如:
127的反碼為0111 1111
-127的反碼為1000 0000
補(bǔ)碼
正數(shù)的補(bǔ)碼與原碼一致;
負(fù)數(shù)的補(bǔ)碼是該數(shù)的反碼加1。
如:
127的補(bǔ)碼為0111 1111
-127的補(bǔ)碼為1000 0001
總結(jié)一下就是:
正數(shù)的原碼、反碼、補(bǔ)碼是一致的;
負(fù)數(shù)的補(bǔ)碼是反碼加1,反碼是對(duì)原碼按位取反,只是最高位(符號(hào)位)不變;
計(jì)算機(jī)數(shù)字運(yùn)算均是基于補(bǔ)碼的。
下面就來(lái)探討一下,為啥要用補(bǔ)碼來(lái)表示數(shù)字。
補(bǔ)碼有啥好?
如果計(jì)算機(jī)內(nèi)部采用原碼來(lái)表示數(shù),那么在進(jìn)行加法和減法運(yùn)算的時(shí)候,需要轉(zhuǎn)化為兩個(gè)絕對(duì)值的加法和減法運(yùn)算;
計(jì)算機(jī)既要實(shí)現(xiàn)加法器,又要實(shí)現(xiàn)減法器,代價(jià)有點(diǎn)大,那么可不可以只用一種類(lèi)型的運(yùn)算器來(lái)實(shí)現(xiàn)加和減的遠(yuǎn)算呢?
很容易想到的就是化減為加,舉一個(gè)生活中的例子來(lái)說(shuō)明這個(gè)問(wèn)題:
時(shí)鐘一圈是360度,當(dāng)然也存在365度,但其實(shí)它和5度是一樣的;
相同的道理,-30度表示逆時(shí)針旋轉(zhuǎn)30度,其與順時(shí)針旋轉(zhuǎn)330度是一樣的;
這里數(shù)字360表示時(shí)鐘的一圈,在計(jì)算機(jī)里類(lèi)似的概念叫模,它可以實(shí)現(xiàn)化減為加,本質(zhì)上是將溢出的部分舍去而不改變結(jié)果。
易得,單字節(jié)(8位)運(yùn)算的模為256=2^8。
在沒(méi)有符號(hào)位的情況下,127+2=129,即:

這時(shí),我們將最高位作為符號(hào)位,計(jì)算機(jī)數(shù)字均以補(bǔ)碼來(lái)表示,則1000 0001的原碼為減1后按位取反得1111 1111,也就是-127。
也就是說(shuō),計(jì)算機(jī)里的129即表示-127,相當(dāng)于模256為一圈,順時(shí)針的129則和逆時(shí)針127即-127是一樣的。
故可以得到以下結(jié)論:
負(fù)數(shù)的補(bǔ)碼為模減去該數(shù)的絕對(duì)值。
如-5的補(bǔ)碼為:
-5=256-5=251=1111 1011(二進(jìn)制)
同樣的,臨界值-128也可以表示出來(lái):
-128=256-128=128=1000 0000(二進(jìn)制)
但是正128就會(huì)溢出了,故單字節(jié)(8位)表示的數(shù)字范圍為-128--127。
最后,我們來(lái)看一下,補(bǔ)碼是如何通過(guò)模的溢出舍棄操作來(lái)完成化減為加的!
16-5=16+(-5)=11

1 0000 1011將溢出位舍去,得0000 1011(二進(jìn)制)=11。
好的,本文分享就到這里,希望能夠幫助到大家。