【轉(zhuǎn)】補(bǔ)碼

?轉(zhuǎn)自百度百科


?計(jì)算機(jī)中的符號(hào)數(shù)有三種表示方法,即原碼、反碼和補(bǔ)碼。三種表示方法均有符號(hào)位和數(shù)值位兩部分,符號(hào)位都是用0表示“正”,用1表示“負(fù)”,而數(shù)值位,三種表示方法各不相同。

?在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來(lái)表示和存儲(chǔ)。原因在于,使用補(bǔ)碼,可以將符號(hào)位和數(shù)值域統(tǒng)一處理;同時(shí),加法和減法也可以統(tǒng)一處理。此外,補(bǔ)碼與原碼相互轉(zhuǎn)換,其運(yùn)算過(guò)程是相同的,不需要額外的硬件電路。

特性

1、一個(gè)負(fù)整數(shù)(或原碼)與其補(bǔ)數(shù)(或補(bǔ)碼)相加,和為模。

2、對(duì)一個(gè)整數(shù)的補(bǔ)碼再求補(bǔ)碼,等于該整數(shù)自身。

3、補(bǔ)碼的正零與負(fù)零表示方法相同。

?模的概念可以幫助理解補(bǔ)數(shù)和補(bǔ)碼。

?“?!笔侵敢粋€(gè)計(jì)量系統(tǒng)的計(jì)數(shù)范圍。如時(shí)鐘等。計(jì)算機(jī)也可以看成一個(gè)計(jì)量機(jī)器,它也有一個(gè)計(jì)量范圍,即都存在一個(gè)“?!?。例如:

?時(shí)鐘的計(jì)量范圍是0~11,模=12。表示n位的計(jì)算機(jī)計(jì)量范圍是0~2(n)-1,模=2(n)。

?“?!睂?shí)質(zhì)上是計(jì)量器產(chǎn)生“溢出”的量,它的值在計(jì)量器上表示不出來(lái),計(jì)量器上只能表示出模的余數(shù)。任何有模的計(jì)量器,均可化減法加法運(yùn)算。

?例如:假設(shè)當(dāng)前時(shí)針指向10點(diǎn),而準(zhǔn)確時(shí)間是6點(diǎn),調(diào)整時(shí)間可有以下兩種撥法:一種是倒撥4小時(shí),即:10-4=6;另一種是順撥8小時(shí):10+8=12+6=6

?在以12模的系統(tǒng)中,加8和減4效果是一樣的,因此凡是減4運(yùn)算,都可以用加8來(lái)代替。對(duì)“?!倍?,8和4互為補(bǔ)數(shù)。實(shí)際上以12模的系統(tǒng)中,11和1,10和2,9和3,7和5,6和6都有這個(gè)特性。共同的特點(diǎn)是兩者相加等于模。

?對(duì)于計(jì)算機(jī),其概念和方法完全一樣。n位計(jì)算機(jī),設(shè)n=8, 所能表示的最大數(shù)是11111111,若再加1成為100000000(9位),但因只有8位,最高位1自然丟失。又回了00000000,所以8位二進(jìn)制系統(tǒng)的模為2^8。在這樣的系統(tǒng)中減法問(wèn)題也可以化成加法問(wèn)題,只需把減數(shù)用相應(yīng)的補(bǔ)數(shù)表示就可以了。把補(bǔ)數(shù)用到計(jì)算機(jī)對(duì)數(shù)的處理上,就是補(bǔ)碼。

?另外兩個(gè)概念:()

?用二進(jìn)制表示正數(shù)不存在問(wèn)題,但是在表示負(fù)數(shù)時(shí)會(huì)存在意想不到的困難。下面表中列出了用二進(jìn)制數(shù)表示負(fù)整數(shù)的三個(gè)系統(tǒng):

?(一):ones' complement:這種表示法中,正數(shù)保持不變(因?yàn)檫@個(gè)方案就是要解決有效地將減法運(yùn)算變成加負(fù)數(shù)的運(yùn)算,所以,正數(shù)不需要變動(dòng),這里的反,就是相對(duì)于正數(shù)的二進(jìn)制形式來(lái)說(shuō)的),負(fù)數(shù)用公式

(n為將符號(hào)位算在內(nèi)的位數(shù))計(jì)算。可以形象的將對(duì)應(yīng)的正數(shù)的二進(jìn)制形式的各個(gè)位取反即可。(這里和得到反碼的步驟不一樣。反碼,補(bǔ)碼,都是從原碼開(kāi)始操作得到。這里是從正數(shù)開(kāi)始操作得到。但兩者除了計(jì)算的起點(diǎn)不同,最終得到的編碼形式是一樣的。為了區(qū)別操作過(guò)程的不同,故仍然采用英文名。)

?用四位二進(jìn)制數(shù)做例子。那么-7的二進(jìn)制(0111)各各位取反得到其ones complement數(shù)(1000)。就是其中最左邊的一位為符號(hào)位。N=7 ,n=4,帶入公式,得

以及其二進(jìn)制形式,過(guò)程如下:

2^{4}= 10000

減1 - 0001

01111

減7 - 0111

01000加粗的這部分呈現(xiàn)的是-7.

(二):twos complement:由于上面一種表示法

(n為將符號(hào)位算在內(nèi)的位數(shù))

觀察公式,twos complement數(shù),相當(dāng)于ones complement 數(shù)+1.

下面用4位二進(jìn)制數(shù)來(lái)做例子:

2^{4}= 10000 2^{4}= 10000

減7 - 0111 減負(fù)7 - 1001

01001加粗部分表示-7 0 0111 加粗部分表示+7

十進(jìn)制數(shù) 符號(hào)位+ 二進(jìn)制絕對(duì)值 的表示方式 ones' complement two's complement
+7 0111 表示方式不變 表示方式不變
+6 0110 表示方式不變 表示方式不變
+5 0101 表示方式不變 表示方式不變
+4 0100 表示方式不變 表示方式不變
+3 0011 表示方式不變 表示方式不變
+2 0010 表示方式不變 表示方式不變
+1 0001 表示方式不變 表示方式不變
+0 0000 表示方式不變 表示方式不變
-0 1000 1111 [1]0000
-1 1001 1110 1111
-2 1010 1101 1110
-3 1011 1100 1101
-4 1100 1011 1100
-5 1101 1010 1011
-6 1110 1001 1010
-7 1111 1000 1001
-8 超出4個(gè)bit所能表達(dá)范圍 超出4個(gè)表達(dá)范圍 1000
注: 要設(shè)計(jì)硬件區(qū)分符號(hào)位,比較絕對(duì)值大小。 無(wú)需設(shè)計(jì)硬件比較大小,但零存在兩種表示方法。 較好的解決上述問(wèn)題。由于零只有一種表達(dá)方式,所以,可以比別的方式多表達(dá)一個(gè)-8.
符號(hào)絕對(duì)值的數(shù)表示方式
Ones Complement Number representation
twos_complement_number_representaion

整數(shù)補(bǔ)碼

求給定數(shù)值的補(bǔ)碼分以下兩種情況:

正數(shù)

正整數(shù)的補(bǔ)碼是其二進(jìn)制表示,與原碼相同 [2] 。

【例1】+9的補(bǔ)碼是00001001。(備注:這個(gè)+9的補(bǔ)碼是用8位2進(jìn)制來(lái)表示的,補(bǔ)碼表示方式很多,還有16位二進(jìn)制補(bǔ)碼表示形式,以及32位二進(jìn)制補(bǔ)碼表示形式,64位進(jìn)制補(bǔ)碼表示形式等。每一種補(bǔ)碼表示形式都只能表示有限的數(shù)字。)

負(fù)數(shù)

求負(fù)整數(shù)的補(bǔ)碼,將其對(duì)應(yīng)正數(shù)二進(jìn)制表示所有位(除符號(hào)位)取反(0變1,1變0,符號(hào)位為1不變)后加1 [2] 。

同一個(gè)數(shù)字在不同的補(bǔ)碼表示形式中是不同的。比如-15的補(bǔ)碼,在8位二進(jìn)制中是11110001,然而在16位二進(jìn)制補(bǔ)碼表示中,就是1111111111110001。以下都使用8位2進(jìn)制來(lái)表示。

【例2】求-5的補(bǔ)碼。

-5對(duì)應(yīng)正數(shù)5(00000101)→所有位取反(11111010)→加1(11111011)

所以-5的補(bǔ)碼是11111011。

【例3】數(shù)0的補(bǔ)碼表示是唯一的。

[+0]補(bǔ)=[+0]反=[+0]原=00000000

[ -0]補(bǔ)=11111111+1=00000000

轉(zhuǎn)化為原碼

已知一個(gè)數(shù)的補(bǔ)碼,求原碼的操作其實(shí)就是對(duì)該補(bǔ)碼再求補(bǔ)碼:

⑴如果補(bǔ)碼的符號(hào)位為“0”,表示是一個(gè)正數(shù),其原碼就是補(bǔ)碼。

⑵如果補(bǔ)碼的符號(hào)位為“1”,表示是一個(gè)負(fù)數(shù),那么求給定的這個(gè)補(bǔ)碼的補(bǔ)碼就是要求的原碼。

【例4】已知一個(gè)補(bǔ)碼為11111001,則原碼是10000111(-7)。

因?yàn)榉?hào)位為“1”,表示是一個(gè)負(fù)數(shù),所以該位不變,仍為“1”。

其余七位1111001取反后為0000110;

再加1,所以是10000111。

補(bǔ)碼的絕對(duì)值

【例5】-65的補(bǔ)碼是10111111

若直接將10111111轉(zhuǎn)換成十進(jìn)制,發(fā)現(xiàn)結(jié)果并不是-65,而是191。

事實(shí)上,在計(jì)算機(jī)內(nèi),如果是一個(gè)二進(jìn)制數(shù),其最左邊的位是1,則我們可以判定它為負(fù)數(shù),并且是用補(bǔ)碼表示。

若要得到一個(gè)負(fù)二進(jìn)制補(bǔ)碼的數(shù)值,只要對(duì)補(bǔ)碼全部取反并加1,就可得到其數(shù)值。

如:二進(jìn)制值:10111111(-65的補(bǔ)碼)

各位取反:01000000

加1:01000001(+65)

小數(shù)補(bǔ)碼求法

一種簡(jiǎn)單的方式,符號(hào)位保持1不變,數(shù)值位從右邊數(shù)第一個(gè)1及其右邊的0保持不變,左邊按位取反。

代數(shù)加減運(yùn)算

補(bǔ)碼加法

[X+Y]補(bǔ) = [X]補(bǔ) + [Y]補(bǔ)

【例6】X=+0110011,Y=-0101001,求[X+Y]補(bǔ)

[X]補(bǔ)=00110011 [Y]補(bǔ)=11010111

[X+Y]補(bǔ) = [X]補(bǔ) + [Y]補(bǔ) = 00110011+11010111=00001010

注:因?yàn)橛?jì)算機(jī)中運(yùn)算器的位長(zhǎng)是固定的(定長(zhǎng)運(yùn)算),上述運(yùn)算中產(chǎn)生的最高位進(jìn)位將丟掉,所以結(jié)果不是100001010,而是00001010,。

補(bǔ)碼減法

[X-Y]補(bǔ) = [X]補(bǔ) - [Y]補(bǔ) = [X]補(bǔ) + [-Y]補(bǔ)【1】

【例7】1-1 [十進(jìn)制]

1的原碼00000001 轉(zhuǎn)換成補(bǔ)碼:00000001

-1的原碼10000001 轉(zhuǎn)換成補(bǔ)碼:11111111

1+(-1)=0

00000001+11111111=00000000

00000000轉(zhuǎn)換成十進(jìn)制為0

0=0所以運(yùn)算正確。

【例8增】-7-(-10) [十進(jìn)制]

改為加法形式:-7-(-10)=-7+(-(-10))

-7的補(bǔ)碼:11111001

-(-10)的補(bǔ)碼:-10的原碼為10001010,-(-10)的原碼為00001010,

-(-10)的補(bǔ)碼就是其原碼,為00001010

-7 - (-10)= -7 + 10 = 3

11111001+00001010 = 00000011

轉(zhuǎn)換成十進(jìn)制為3

補(bǔ)碼乘法

補(bǔ)碼的乘法不具備【XY】補(bǔ)=【X】補(bǔ)×【Y】補(bǔ)的性質(zhì)。但是【XY】補(bǔ)==【X】補(bǔ)×Y,所得結(jié)果再取補(bǔ)碼,如x=101,y=011,[xy]補(bǔ)=-[(-101)011]=-[011*011]=-01001=10111

其中,若【Y】補(bǔ)=y31y30……y0,則 Y=-y312^31+y30230+……+y0*20

代數(shù)解釋

在十進(jìn)制中我們可以把n位二進(jìn)制體系中的數(shù)

a表示為:

求補(bǔ)碼,意味著求:

而根據(jù)等比數(shù)列求和公式:



因?yàn)檫@里k0,k1,k2,k3……不是0就是1,所以1-k0,1-k1,1-k2的運(yùn)算就是二進(jìn)制下的取反

注:n位二進(jìn)制,最高位為符號(hào)位,因此表示的數(shù)值范圍-2^(n-1) ——2^(n-1) -1,所以模為2n。上面提到的8位二進(jìn)制模為28是因?yàn)樽罡呶环欠?hào)位,表示的數(shù)值范圍為0——2^8-1。

補(bǔ)碼總結(jié)

補(bǔ)碼只是一種相對(duì)合理的編碼方案。這個(gè)方案在負(fù)數(shù)的機(jī)器表示中解決了3個(gè)問(wèn)題:

  1. 數(shù)的表示

    在數(shù)的表示上通過(guò)人為的定義來(lái)消除編碼映射的不唯一性,對(duì)轉(zhuǎn)換后的10000000強(qiáng)制認(rèn)定為-128。當(dāng)然對(duì)原碼和反碼也可以做這種強(qiáng)制認(rèn)定,那為什么原碼和反碼沒(méi)有流行起來(lái)?原碼和反碼沒(méi)有流行起來(lái),是因?yàn)樵跀?shù)的運(yùn)算上對(duì)符號(hào)位的處理無(wú)法用當(dāng)時(shí)已有的機(jī)器物理設(shè)計(jì)來(lái)實(shí)現(xiàn)。由于原碼和反碼在編碼時(shí)采用了硬性的人工設(shè)計(jì),這種設(shè)計(jì)在數(shù)理上無(wú)法自動(dòng)的通過(guò)模來(lái)實(shí)現(xiàn)對(duì)符號(hào)位的自動(dòng)處理,符號(hào)位必須人工處理,必須對(duì)機(jī)器加入新的物理部件來(lái)專(zhuān)門(mén)處理符號(hào)位,這加大了機(jī)器設(shè)計(jì)難度,加大的機(jī)器成本,不到萬(wàn)不得已,不走這條路。

  2. 數(shù)的運(yùn)算

    設(shè)計(jì)補(bǔ)碼時(shí),有意識(shí)的引用了模運(yùn)算在數(shù)理上對(duì)符號(hào)位的自動(dòng)處理,利用模的自動(dòng)丟棄實(shí)現(xiàn)了符號(hào)位的自然處理,僅僅通過(guò)編碼的改變就可以在不更改機(jī)器物理架構(gòu)的基礎(chǔ)上完成的預(yù)期的要求,所以補(bǔ)碼沿用至今。

  3. 自身邏輯意義的完整性

    補(bǔ)碼這個(gè)編碼方案要解決的是如何在機(jī)器中表示負(fù)數(shù),其本質(zhì)意義為用一個(gè)正數(shù)來(lái)表示這個(gè)正數(shù)對(duì)應(yīng)的負(fù)數(shù)。所謂-20的補(bǔ)碼是指:如何在機(jī)器中用補(bǔ)碼形式表示-20。具體過(guò)程是這樣的:將20的二進(jìn)制形式直接寫(xiě)出00010100,然后所有位取反變成11101011,再加1變成了11101100。最簡(jiǎn)單的補(bǔ)碼轉(zhuǎn)換方式,不必去理會(huì)轉(zhuǎn)換過(guò)程中的符號(hào)位,只關(guān)注轉(zhuǎn)換前和最終轉(zhuǎn)換后的符號(hào)位就行了。

    那么對(duì)11101100求出其補(bǔ)碼又具有什么現(xiàn)實(shí)含義呢?對(duì)一個(gè)數(shù)求補(bǔ),邏輯過(guò)程是對(duì)這個(gè)數(shù)的所有的二進(jìn)制位按位取反再加1?,F(xiàn)實(shí)含義是求出這個(gè)數(shù)對(duì)應(yīng)的負(fù)數(shù)形式。對(duì)11101100求補(bǔ)就是求出這個(gè)數(shù)對(duì)應(yīng)的負(fù)數(shù)的形式,直接操作下11101100,先所有位取反00010011,再加上1就成了00010100。對(duì)11101100求出其補(bǔ)碼的含義:11101100按照現(xiàn)行補(bǔ)碼碼制表示的有符號(hào)數(shù)是-20,對(duì)于-20求補(bǔ)就是求出其對(duì)應(yīng)的負(fù)數(shù)-(-20),現(xiàn)實(shí)中-(-20)是+20,那么求補(bǔ)運(yùn)算的結(jié)果符合現(xiàn)實(shí)情況嗎,00010100轉(zhuǎn)換成有符號(hào)數(shù)正是+20,這就說(shuō)明了補(bǔ)碼自身邏輯意義是完整的,是不會(huì)自相矛盾的。

  4. 最后,補(bǔ)碼的總前提是機(jī)器數(shù),不要忘了機(jī)器數(shù)的符號(hào)位含義,最高位為0表示正數(shù),最高位為1表示負(fù)數(shù),而最高位是指機(jī)器字長(zhǎng)的最左邊一位。字節(jié)數(shù)100B,最高位為00000100中的最左邊的0。

【1】 在上一個(gè)版本中有如下說(shuō)明:

其中[-Y]補(bǔ) 稱(chēng)為負(fù)補(bǔ),求負(fù)補(bǔ)的方法是:負(fù)數(shù)的絕對(duì)值的原碼所有位按位取反;然后整個(gè)數(shù)加1。(恢復(fù)本來(lái)解釋。請(qǐng)路人真正理解并實(shí)際驗(yàn)證后再修改。以免誤導(dǎo)大眾。另外,例6不具典型性,新增例7。)

私以為, 不必要提出負(fù)補(bǔ)的概念以使問(wèn)題復(fù)雜化,盡管該解法是正確的,但卻完全沒(méi)有必要增加新的運(yùn)算方法及運(yùn)算結(jié)構(gòu)。求[-Y]補(bǔ),只需,先將符號(hào)位取反,求出-Y, 再求-Y的補(bǔ)碼即可。盡管這與求負(fù)補(bǔ)的方法實(shí)際上是一致的, 但是卻簡(jiǎn)化了概念,僅僅是對(duì)過(guò)去概念以及運(yùn)算結(jié)構(gòu)的復(fù)用。


?轉(zhuǎn)自百度百科

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 網(wǎng)站亂碼問(wèn)題我們會(huì)經(jīng)常碰到,大多見(jiàn)于非英文的中文字符或其他字符亂碼,而且,這類(lèi)問(wèn)題常常是因?yàn)榫幋a方式問(wèn)題,主要原因...
    波段頂?shù)?/span>閱讀 3,315評(píng)論 1 9
  • http://www.itdecent.cn/p/55a8195291db本篇文章講解了計(jì)算機(jī)的原碼, 反碼和補(bǔ)...
    PupilCHen閱讀 1,277評(píng)論 1 48
  • 本篇文章講解了計(jì)算機(jī)的原碼, 反碼和補(bǔ)碼. 并且進(jìn)行了深入探求了為何要使用反碼和補(bǔ)碼, 以及更進(jìn)一步的論證了為何可...
    yang2yang閱讀 2,459評(píng)論 1 13
  • 到目前為止,我們學(xué)習(xí)了十進(jìn)制、二進(jìn)制、八進(jìn)制、十六進(jìn)制等用來(lái)代表實(shí)際數(shù)值的數(shù),稱(chēng)為真值,這些數(shù)我們?cè)偃粘I钪卸紩?huì)...
    codingriver閱讀 28,009評(píng)論 4 14
  • 張東輝,焦點(diǎn)初級(jí)第43期堅(jiān)持原創(chuàng)分享第291天(2018.6.19) 今天周工作例會(huì),我給大家通了一下招生方案,當(dāng)...
    星悅傳奇閱讀 254評(píng)論 0 0

友情鏈接更多精彩內(nèi)容