基本概念
在計算機(jī)中晶框,二進(jìn)制數(shù)據(jù)有三種形式:原碼煌集、反碼和補(bǔ)碼,要弄清楚補(bǔ)碼的意義姨涡,首先讓我們來了解三種形式的定義史煎。
假設(shè)字長為4谦屑,其中最高位為符號位:正數(shù)為0,負(fù)數(shù)為1篇梭。剩下的3位表示該數(shù)的絕對值氢橙。
正數(shù)的原碼反碼補(bǔ)碼都是一樣的。
1.原碼
+3的原碼:0011
-3的原碼:1011
2.反碼
反碼就是在原碼的基礎(chǔ)上恬偷,符號位不變其他位按位取反(就是0變1悍手,1變0)就可以了。
+3的反碼:0011
-3的反碼:1100
3.補(bǔ)碼
補(bǔ)碼也非常的簡單袍患,就是在反碼的基礎(chǔ)上按照正常的加法運算加1坦康。
+3的補(bǔ)碼:0011
-3的補(bǔ)碼:1101
從前面的三種數(shù)字編碼類型的定義,我們可以看出數(shù)據(jù)的原碼诡延,使用符號位來區(qū)分了正負(fù)數(shù)滞欠,更加符合人腦直觀識別并且用于計算的表達(dá)方式。但是在計算機(jī)中肆良,是通過補(bǔ)碼的形式保存數(shù)據(jù)筛璧,下面將解釋為什么計算機(jī)系統(tǒng)要用補(bǔ)碼存放數(shù)據(jù)。
周期系統(tǒng)
若一組事件或現(xiàn)象按同樣的順序重復(fù)出現(xiàn)惹恃,則把完成這一組事件或現(xiàn)象的時間或空間間隔夭谤,稱為周期。
周期性原碼累加系統(tǒng)
定義一個字長為4的二進(jìn)制累加系統(tǒng)巫糙,該系統(tǒng)的規(guī)則就是從左到右依次累加0001朗儒;
0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 | 0000 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 0 |
如果最高位是符號位時,圖表第二行表示原碼對應(yīng)的10進(jìn)制數(shù)曲秉,不難發(fā)現(xiàn)采蚀,如果在確定字長為4時,累加過程是符合周期性變化的承二,原因就是當(dāng)1111+1時會出現(xiàn)字節(jié)溢出的情況榆鼠,10000的最高位溢出失效,導(dǎo)致結(jié)果變?yōu)?000亥鸠;
周期性時鐘系統(tǒng)
在現(xiàn)實生活中妆够,時鐘顯然是符合周期性的识啦,12點過后是1點,人們早已習(xí)慣了這種思維方式神妹,所以會忽略對時鐘這種表示時間方式的思考颓哮。凌晨12點加1個小時,其實表式的時間是天數(shù)加1之后的1點鸵荠,但是對于時鐘系統(tǒng)而言冕茅,天數(shù)不是自己所能表示的,這就相當(dāng)于上面圖表中1111+1=0000(1|0000 1是溢出位蛹找,在字長為4的系統(tǒng)中是不能表示的)姨伤。
時鐘系統(tǒng)和二進(jìn)制數(shù)原碼的累加系統(tǒng)都有周期性,具有周期性的原因是當(dāng)前層次系統(tǒng)中有其不能表示或未能感知的其他層次系統(tǒng)庸疾。
計算機(jī)運算系統(tǒng)正是利用了周期性的這一特性乍楚。
周期系統(tǒng)中的加減轉(zhuǎn)化
時鐘系統(tǒng)加減法轉(zhuǎn)化
假設(shè)時針向順時針方向撥動為加,逆時針撥動為減届慈。
7點順時針撥動1格表示的是:7+1=8
7點逆時針撥動1格表示的是:7-1=6
7點順時針撥動11格表示的是:7+11=6
所以很容易發(fā)現(xiàn)徒溪,在時鐘中7-1=7+11,這就是周期系統(tǒng)中加減法發(fā)的轉(zhuǎn)化方式金顿,其實和簡單臊泌,也很符合我們的直覺。
所以重新考慮原碼的減法問題揍拆,n-m = n+(MAX-m),其中MAX就是該周期中所能表示的所有數(shù)的數(shù)量缺虐,放到上面原碼的例子中就是16個,而放到時鐘系統(tǒng)中就是12個礁凡。如:
周期性的時鐘系統(tǒng):
12 - 1 = 12 + (12 -1);
7 - 4 = 7 +(12-4)慧妄;
累加系統(tǒng)加減法轉(zhuǎn)化
在說原碼累加系統(tǒng)加減法轉(zhuǎn)化例子之前顷牌,我們再看下圖表
A | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 | 0000 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 0 |
A2 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | -0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | 0 |
B | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1111 | 1110 | 1101 | 1100 | 1011 | 1010 | 1001 | 1000 | 0000 |
B1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | -0 | 0 |
B2 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 |
為了方便說明在每一行的開始定義了該行的名稱分別為A、A1塞淹、A2窟蓝、B、B1饱普、B2.
累加系統(tǒng)不同于周期系統(tǒng)的一點是會有負(fù)數(shù)的概念出現(xiàn)运挫,A2行就是最高位表示符號位時原碼解碼后表示的十進(jìn)制數(shù)。在圖表中發(fā)現(xiàn)套耕,當(dāng)有符號位時二進(jìn)制原碼的累加轉(zhuǎn)換為十進(jìn)制數(shù)時谁帕,出現(xiàn)了與我們現(xiàn)實生活數(shù)學(xué)公理相違背的現(xiàn)象,錯誤發(fā)生在最高位為1后冯袍,如1001+1=1010(-1+1=-2)匈挖,原因是在定義這個累加系統(tǒng)在運算時就沒有讓系統(tǒng)知道高位0與1有不同之處碾牌,也就是累加的計算過程中無法感知符號。
解決問題的方式有兩種
- 去重新完善這個累加系統(tǒng)儡循,讓他在最高位為1換一套計算方式舶吗,也就是說在運算過程中去感知最高位的意義。
- 轉(zhuǎn)化出現(xiàn)問題的狀態(tài)择膝,使?fàn)顟B(tài)轉(zhuǎn)移為當(dāng)前系統(tǒng)能使用的誓琼,也就是在編碼過程中去讓無法感知符號的運算系統(tǒng)計算出正確的結(jié)果。
在計算機(jī)系統(tǒng)中肴捉,解決這個問題的方式顯然是用第二種腹侣,cpu是無法感知符號位的,這樣做可以減少cpu設(shè)計難度每庆,極大地提高運行效率筐带。
所以也就是說cpu運算時還是按照A行進(jìn)行累加,但在解碼運算結(jié)果時做一些處理缤灵,即將A轉(zhuǎn)變?yōu)锽伦籍,而B1是不考慮溢出和臨界值時的十進(jìn)制正確結(jié)果。A解碼為B的算法就是當(dāng)最高位為1時腮出,符號位不變帖鸦,其他位取反,不難發(fā)現(xiàn)這就是反碼的定義胚嘲。
當(dāng)這樣轉(zhuǎn)化后會發(fā)現(xiàn)出現(xiàn)了0和-0兩個0并且會出現(xiàn)0 - 1 = -0這種情況(將0向左移動)作儿。所以還得做一個簡單的處理,就是去加一個1馋劈,也就是B1轉(zhuǎn)化為B2,而B2就是最終的正確十進(jìn)制值攻锰。
其實按照直覺可以發(fā)現(xiàn),當(dāng)符號位轉(zhuǎn)化時妓雾,其他位應(yīng)該取反才能得到正確結(jié)果娶吞,正數(shù)越加越大,負(fù)數(shù)越加越小械姻。
根據(jù)我們的努力將A通過反碼的解碼方式轉(zhuǎn)變?yōu)锽,而讓B的解碼結(jié)果加1(補(bǔ)碼)妒蛇,得到了B2,從而使累加系統(tǒng)當(dāng)出現(xiàn)負(fù)數(shù)時變得合理起來。在轉(zhuǎn)變?yōu)锽2之后楷拳,我們需要解決的是如何用累加系統(tǒng)去表示減法绣夺。本質(zhì)上和前面的時鐘系統(tǒng)轉(zhuǎn)化是一樣的』兑荆可以借助上面的時鐘系統(tǒng)以及下面的例子去理解累加系統(tǒng)的減法運算陶耍。
在看例子之前,稍微介紹一下“慕牵” 的概念:
模是指一個計量系統(tǒng)的計數(shù)范圍物臂,取模運算實質(zhì)上是計量器產(chǎn)生“溢出”的量旺拉,前面的周期系統(tǒng)中n-m = n+(MAX-m)得出的加減轉(zhuǎn)化其實就是用到了模的概念,MAX就是模棵磷。
計算 4 - 3
- 編碼 0100 - 0011
//n-m = n+(MAX-m) ==》(10000-0011) 其結(jié)果就是0011的補(bǔ)碼
轉(zhuǎn)化為 0100 + (10000-0011) = 0100 + 1101
cpu調(diào)用加法器得出 10001
最高位溢出 0001
解碼 1
重新計算 3 - 4
編碼 0011 - 0100
轉(zhuǎn)化為 0011 + (10000-0100) = 0011 + 1100
cpu調(diào)用加法器得出 1111
//參考A轉(zhuǎn)變B2(也就是原碼轉(zhuǎn)補(bǔ)碼)
- 解碼-0001= -1
總結(jié)
在計算機(jī)系統(tǒng)中蛾狗,計算整數(shù)加減法時,需要經(jīng)過以下步驟:
轉(zhuǎn)變?yōu)?進(jìn)制數(shù)仪媒;
運算時原碼解碼為補(bǔ)碼沉桌;n-m = n+(MAX-m),(MAX-m)也就是m的補(bǔ)碼算吩,理解時參考時鐘系統(tǒng)留凭。
cpu調(diào)用加法器;
解碼偎巢;再進(jìn)行一次補(bǔ)碼解碼蔼夜,理解時參考A轉(zhuǎn)化為B2。