說說“補(bǔ)碼”
一般教材在介紹有符號數(shù)在計算機(jī)中的表示方式時,都會從原碼、反碼開始講,最后得出計算機(jī)里有符號數(shù)采用補(bǔ)碼表示,而求一個負(fù)數(shù)補(bǔ)碼的常用方法就是原碼取反,得反碼再加1。所以這幾個概念之間有一定的聯(lián)系。
(說明: 非負(fù)數(shù)的原碼、反碼、補(bǔ)碼相同)
這里不贅述他們的數(shù)學(xué)含義,只說采用補(bǔ)碼表示有什么好處。
一、解決+0與-0表示的二義性
在數(shù)學(xué)上+0與-0表示同一個數(shù)值,但是如果用原碼或反碼,在計算機(jī)里+/-0對應(yīng)的都是兩個不同的01串,以8位為例:
原碼+0:0000 0000? ? ?原碼-0: 1000 0000
反碼+0 :? 0000? 0000? ? ?反碼-0: 1111?1111
計算機(jī)里是不允許(或者說盡量避免)二義性存在的,所以原碼表示和反碼表示就被淘汰了,那怎么表示有符號數(shù)呢?
聰明的前人想到了補(bǔ)碼表示法(它的數(shù)學(xué)含義及定義這里不贅述了),這里只說求補(bǔ)碼的方法:非負(fù)數(shù)的補(bǔ)碼=其原碼=其反碼,負(fù)數(shù)的補(bǔ)碼按位取反加1,仍以8位為例:

從表中看到,補(bǔ)碼表示做到了一一對應(yīng),n位二進(jìn)數(shù)數(shù)的有符號數(shù)表示范圍-2^(n-1) ~~+2^(n-1)-1,+/-0的補(bǔ)碼表示是唯一的:全0。
這里要強(qiáng)調(diào)幾點:有符號數(shù)的最大值為+2^(n-1)-1,形式為0111……11;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?有符號數(shù)的最小值是-2^(n-1),形式為1000……00;
? ? ? ? ? ? ? ? ? ? ? ? ? ? -1在任意字長的系統(tǒng)里都輸全1。
二、采用補(bǔ)碼表示,可以簡化計算機(jī)中運(yùn)算器設(shè)計
采用補(bǔ)碼表示后,計算機(jī)中底層硬件進(jìn)行的是二進(jìn)制加法運(yùn)算,根本不區(qū)別是有符號數(shù)還是無符號數(shù),既可以被解釋成有符號數(shù)(下圖右邊),也可以被解釋成無符號數(shù)(下圖左邊),為了方便,以4位為例:?

采用補(bǔ)碼表示,計算機(jī)不需要實現(xiàn)單獨(dú)的減法器,和數(shù)學(xué)上減一個數(shù)等于加上該數(shù)的負(fù)數(shù)相一致。
三、方便數(shù)據(jù)類型擴(kuò)展
學(xué)計算機(jī)的都知道數(shù)據(jù)類型,也就是數(shù)據(jù)的字節(jié)寬度,大多數(shù)語言是允許有默認(rèn)類型轉(zhuǎn)換的,即不同數(shù)據(jù)類型之間的數(shù)據(jù)可以進(jìn)行轉(zhuǎn)換(一般小字節(jié)寬度可以擴(kuò)展為大字節(jié)寬度),然后運(yùn)算、存儲等,采用補(bǔ)碼表示就很容易進(jìn)行數(shù)據(jù)寬度擴(kuò)展,補(bǔ)碼是針對有符號數(shù)的,在進(jìn)行類型轉(zhuǎn)換擴(kuò)展時,只要進(jìn)行符號位擴(kuò)展,數(shù)值本身不變,例如全1在任何機(jī)器字長下表示的有符號的都是-1,再舉個例子,一個字節(jié)的-7表示為:1111 1001,把該數(shù)據(jù)擴(kuò)展為兩個字節(jié),只要符號位1擴(kuò)展為:1111 1111 1111 1001即可,補(bǔ)碼表示對給數(shù)據(jù)類型轉(zhuǎn)換帶來了很大便利。