官术网_书友最值得收藏!

2.2 數(shù)據(jù)編碼

2.2.1 原碼

原碼就是原來(lái)的碼,如圖2-1所示,以8位二進(jìn)制為例,用最高位表示符號(hào),圖中以下劃線來(lái)區(qū)分,1為負(fù),0為正,剩余的7位是真值的絕對(duì)值,即用第一位表示符號(hào),其余位表示數(shù)值。原碼是人腦最容易理解和計(jì)算的一種形式,為什么呢?

圖2-1 原碼編碼示意圖

從原碼的編碼能夠看出,無(wú)論正數(shù)還是負(fù)數(shù),除了符號(hào)位外,表示數(shù)值的二進(jìn)制位(剩余的7位)都是隨著真值絕對(duì)值的增加而增加,如圖中三角形表示的趨勢(shì)一樣,向數(shù)值坐標(biāo)軸兩邊逐漸增大,這和人類(lèi)的計(jì)數(shù)習(xí)慣一致的,容易理解和記憶。但是,原碼的編碼方式存在一個(gè)缺點(diǎn),大家知道,8位二進(jìn)制實(shí)際上可以表示的狀態(tài)數(shù)是28(256)個(gè),但實(shí)際上,原碼表示的數(shù)的范圍僅為-127~127,總共可表示255個(gè)數(shù),中間的“+0”和“- 0”為一個(gè)數(shù),即“0”值,但卻用兩個(gè)狀態(tài)(0000 0000)和(1000 0000)來(lái)表示,浪費(fèi)了一個(gè)狀態(tài)的資源。所以這種編碼方式無(wú)法實(shí)現(xiàn)計(jì)算機(jī)二進(jìn)制數(shù)與人類(lèi)使用的十進(jìn)制數(shù)的一一映射關(guān)系,二進(jìn)制可以映射為十進(jìn)制,但是當(dāng)十進(jìn)制映射為二進(jìn)制時(shí),就會(huì)出現(xiàn)一個(gè)“0”對(duì)應(yīng)兩個(gè)二進(jìn)制的問(wèn)題,存在表述不明的隱患,無(wú)法用于計(jì)算機(jī)的運(yùn)算。可參考二維碼視頻講解。

2.2.2 反碼

反碼就是取反獲得的編碼。正數(shù)的反碼是其本身;負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上,符號(hào)位不變,其余各個(gè)位取反,如圖2-2所示。

圖2-2 反碼編碼示意圖

[+5]=[0000 0101]=[0000 0101]

[-5]=[1000 0101]=[1111 1010]

從上面可以看出,如果一個(gè)反碼表示的是負(fù)數(shù),人腦無(wú)法直接識(shí)別,需要轉(zhuǎn)化計(jì)算一下才能看出來(lái)。

反碼與原碼不同之處在于表示負(fù)數(shù)時(shí),除了符號(hào)位外,表示數(shù)值的位隨著真值絕對(duì)值的增加而減小,如圖中左邊三角形表示的趨勢(shì)一樣。例如,-127對(duì)應(yīng)的二進(jìn)制數(shù)為1000 0000,去掉最高位符號(hào)位1后,二進(jìn)制表示的數(shù)為000 0000(0);-1對(duì)應(yīng)的二進(jìn)制數(shù)為1111 1110,去掉最高位符號(hào)位1后,二進(jìn)制表示的數(shù)為111 1110(126)。反碼的

編碼方式與原碼相似,8位二進(jìn)制可以表示的狀態(tài)數(shù)仍為255個(gè),范圍是-127~127,中間的“+0”和“-0”對(duì)應(yīng)的狀態(tài)分別用(0000 0000)和(1111 1111)來(lái)表示,同樣浪費(fèi)了一個(gè)狀態(tài)的資源。

但反碼比原碼有一個(gè)優(yōu)勢(shì),就是它更能讓計(jì)算機(jī)發(fā)揮優(yōu)勢(shì)。因?yàn)閷?duì)于計(jì)算機(jī),加減運(yùn)算是最基礎(chǔ)的運(yùn)算,在計(jì)算過(guò)程中,讓計(jì)算機(jī)再辨別“符號(hào)位”顯然會(huì)增加計(jì)算機(jī)基礎(chǔ)電路設(shè)計(jì)的復(fù)雜性,于是人們想出了將符號(hào)位也參與運(yùn)算的方法。根據(jù)運(yùn)算法則可知,減去一個(gè)正數(shù)等于加上一個(gè)負(fù)數(shù),即1-1=1+(-1)=0,所以機(jī)器可以只進(jìn)行加法運(yùn)算而不用減法,這樣計(jì)算機(jī)運(yùn)算的設(shè)計(jì)就更簡(jiǎn)單了。

但是用原碼無(wú)法實(shí)現(xiàn)上述的設(shè)計(jì),大家看下面這個(gè)例子。

計(jì)算十進(jìn)制的表達(dá)式:1-1=0

1-1=1+(-1)=[0000 0001]+ [1000 0001]= [1000 0010]=-2

從上面的運(yùn)算過(guò)程可以看出,如果采用原碼,讓符號(hào)位參與計(jì)算,顯然對(duì)于減法來(lái)說(shuō)結(jié)果是不正確的,這也就是為什么計(jì)算機(jī)內(nèi)部不使用原碼表示一個(gè)數(shù)的原因。

為了解決原碼無(wú)法做減法的問(wèn)題,出現(xiàn)了反碼。即

1-1=1+(-1)=[0000 0001]+ [1111 1110]= [1111 1111]= -0

這樣看來(lái),用反碼計(jì)算減法,結(jié)果的真值部分是正確的,剩下唯一的問(wèn)題就出現(xiàn)在“0”這個(gè)數(shù)值上。無(wú)論是原碼還是反碼,0都會(huì)被表示為+0和-0,只是在原碼和反碼中表示“-0”的二進(jìn)制數(shù)不同。但是,“0”帶符號(hào)是沒(méi)有任何意義的,一個(gè)十進(jìn)制數(shù)同樣面臨出現(xiàn)兩個(gè)二進(jìn)制數(shù)映射關(guān)系的問(wèn)題,產(chǎn)生不確定性,這是原碼和反碼所不能解決的,必須改進(jìn)編碼方式,解決0有兩個(gè)編碼的問(wèn)題,于是,補(bǔ)碼出現(xiàn)了。可參考二維碼視頻講解。

圖2-3 補(bǔ)碼編碼示意圖

2.2.3 補(bǔ)碼

正數(shù)的補(bǔ)碼就是其本身;負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上,符號(hào)位不變,其余各位取反,然后加1(在反碼的基礎(chǔ)上加1),例如:

[+1]=[0000 0001]= [0000 0001]= [0000 0001]補(bǔ)

[-1]=[1000 0001]= [1111 1110]= [1111 1111]補(bǔ)

補(bǔ)碼的編碼方式如圖2-3所示,從“-0”開(kāi)始,所有的負(fù)數(shù)都向左平移了一位,“-0”的二進(jìn)制數(shù)表示“-1”;“-1”的二進(jìn)制數(shù)表示“-2”,…,“-127”的二進(jìn)制數(shù)表示“-128”。將“+0”和“-0”值重疊的兩個(gè)狀態(tài)分開(kāi),向數(shù)值的下限延伸了一個(gè),即有了“-128”這個(gè)數(shù)值。所以,用補(bǔ)碼表示的范圍是:-128~127,正好28(256)個(gè)狀態(tài),實(shí)現(xiàn)了十進(jìn)制數(shù)與二進(jìn)制數(shù)的一一對(duì)應(yīng)。可參考二維碼視頻講解。

主站蜘蛛池模板: 巴林右旗| 镇雄县| 贵南县| 邹平县| 宁河县| 会东县| 峡江县| 东方市| 荣成市| 鄂托克旗| 前郭尔| 凤庆县| 海阳市| 镶黄旗| 隆昌县| 泗洪县| 拉萨市| 怀宁县| 莎车县| 定远县| 犍为县| 绿春县| 彰化市| 洞头县| 汨罗市| 瓦房店市| 永城市| 达州市| 民勤县| 米泉市| 临潭县| 保德县| 成安县| 繁峙县| 东兴市| 关岭| 静海县| 敦化市| 固始县| 东平县| 怀安县|