?轉(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. |
整數(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)題:
-
數(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)不得已,不走這條路蟀给。
-
數(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ǔ)碼沿用至今。
-
自身邏輯意義的完整性
補(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“枚桑現(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ì)自相矛盾的遣耍。
最后,補(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)自百度百科