補(bǔ)碼的幾個(gè)問題
補(bǔ)碼是一個(gè)比較讓人煩惱的問題。
1:補(bǔ)碼的定義

從上述定義可以看出,對(duì)于負(fù)數(shù)來說,

這里的x代表的是一個(gè)負(fù)數(shù),比如x=-101,n代表的是x這個(gè)負(fù)數(shù)不考慮符號(hào)位的數(shù)值的位數(shù),在這里就等于3.圖2可以變?yōu)?br>

這意味著,一個(gè)負(fù)數(shù)的補(bǔ)碼加上這個(gè)負(fù)數(shù)的絕對(duì)值將出現(xiàn)歸零的現(xiàn)象,比如

這里1011是-5的補(bǔ)碼,最高位是符號(hào)位,按照?qǐng)D3的定義,這里的n等于3,所以-5的補(bǔ)碼
1011加上-5的絕對(duì)值5,即0101,得出的答案是2的4次方,也就是2^(n+1),而此時(shí)的結(jié)果已經(jīng)超出了上面的數(shù)字的位數(shù)(包括符號(hào)位4位),如果保留四位,則結(jié)果是0000,也就是說,一個(gè)負(fù)數(shù)的補(bǔ)碼加上這個(gè)負(fù)數(shù)的絕對(duì)值,會(huì)連同符號(hào)位一起歸零。
當(dāng)然,如果不算符號(hào)位,則就是3位數(shù)值部分相加

當(dāng)然也會(huì)歸零。
一個(gè)字節(jié)8位,如果采用原碼表示正整數(shù)(含0),可以表達(dá)0-255,即 2^8=256,一共256種狀態(tài),從全0到全1的各種排列組合。如果要表示負(fù)數(shù),則符號(hào)位需要占用一位(最高位,1代表負(fù)數(shù),0代表正數(shù)),因此其絕對(duì)值最大范圍為0-127,即2^7=128,一共正負(fù)各128種狀態(tài),如果不采用特殊處理,這時(shí)候0占用2個(gè)編碼,10000000即負(fù)0,和00000000即正0,數(shù)據(jù)表示范圍為-127到-0及+0到127,這樣總體上一個(gè)字節(jié)只有255種狀態(tài),因?yàn)槠渲?具有正0和負(fù)0之分,這不符合數(shù)學(xué)意義也浪費(fèi)一個(gè)編碼。因此人們想到把負(fù)0利用起來,即當(dāng)遇到負(fù)數(shù)時(shí),采用補(bǔ)碼來表示就可以解決這個(gè)問題,而遇到正數(shù)或0時(shí)還是保留原碼表示。因此這個(gè)負(fù)0通過補(bǔ)碼算法處理后自然而然地被利用起來,用來表示-128.
為了證明10000000這個(gè)負(fù)0代表-128補(bǔ)碼的正確性,考慮

因?yàn)?1111111是+127的原碼,上述運(yùn)算等于是計(jì)算了(-128+127)這個(gè)結(jié)果,很明顯其結(jié)果應(yīng)該是-1,而11111111正是-1的補(bǔ)碼,其它可以類推,因此將10000000代表-128補(bǔ)碼是正確的。
上述運(yùn)算還表明,補(bǔ)碼的重要功能就是把減法(127-128)運(yùn)算變成了加法(-128+127)運(yùn)算。
綜上為:
補(bǔ)碼:8位補(bǔ)碼能夠表示數(shù)的范圍是 -128~127。
3:變形補(bǔ)碼
對(duì)于小數(shù)來說,其補(bǔ)碼定義為

即小數(shù)補(bǔ)碼的定義中,其整數(shù)部分的那一位是用來表示符號(hào)位的。

圖6的定義也是針對(duì)小數(shù)的,其中的100是二進(jìn)制,表示數(shù)字4。這種定義就意味著每個(gè)小數(shù)有兩個(gè)符號(hào)位。


圖8為兩個(gè)正小數(shù)相加,這種情況并沒有發(fā)生溢出,這是因?yàn)檫@兩個(gè)小數(shù)都小于0.5,所以它們的和小于1.如果是00.11+00.10,則結(jié)果為01.01,這種情況下就發(fā)生了溢出,因?yàn)閮蓚€(gè)小數(shù)的和已經(jīng)超過了1.再比如

這是兩個(gè)負(fù)小數(shù)的補(bǔ)碼相加,其結(jié)果也沒有溢出。但如果仔細(xì)觀察,可以看出,相加的過程中是發(fā)生了由小數(shù)的最高位向符號(hào)位的進(jìn)位的,那為什么沒有產(chǎn)生溢出呢?這是因?yàn)?1.10101和11.10111這兩個(gè)小數(shù)補(bǔ)碼的數(shù)值部分都是大于0.5的,即意味著著兩個(gè)負(fù)小數(shù)的絕對(duì)值是小于0.5的,而兩個(gè)絕對(duì)值小于0.5的小數(shù)相加,其絕對(duì)值不可能大于1,而采用補(bǔ)碼相加的話,其相加的絕對(duì)值卻會(huì)超過1,因此會(huì)產(chǎn)生進(jìn)位,但由于是兩個(gè)負(fù)數(shù)相加,即
11.11 =-0.75
+ 11.10 =-0.5
-------------------------
111.01 =-1.25保留小數(shù)部分=-0.25
其最高位的那個(gè)1去掉,剩下11.01,即上面兩個(gè)負(fù)小數(shù)的補(bǔ)碼相加所產(chǎn)生的進(jìn)位,被它們的符號(hào)位相加剛好抵消了。