用定點(diǎn)小數(shù)引出數(shù)值的三種編碼(原碼、補(bǔ)碼和反碼)方法是最方便的。
(1) 原碼表示法,是用機(jī)器數(shù)的最高一位代表符號(hào),以下各位給出數(shù)值絕對(duì)值的表示方法。其定義為:
[X]原= (2.9)
例如, X=+0.1011, [X]原=01011
X=-0.1011, [X]原=11011
按定義,當(dāng)X=-0.1011時(shí),[X]原= 1-X= 1.0000-(-0.1011) =11011。這里的X為數(shù)的實(shí)際值,即相應(yīng)機(jī)器數(shù)的真值,[X]原為原碼表示的機(jī)器數(shù)。
原碼的性質(zhì):
?、?在原碼表示中,機(jī)器數(shù)的最高位是符號(hào)位,0代表正號(hào),1代表負(fù)號(hào),以下各位是數(shù)的絕對(duì)值,即[X]原 = 符號(hào)位 + |X|。
?、?在原碼表示中,零有兩種表示形式,即
[+0.0]原=00000, [-0.0]原=10000
設(shè)X、Y的真值分別為X=+0.0000,Y=-0.0000。則按原碼定義[X]原=00000, [Y]原= 1-Y = 1+0.0000 = 10000,因此零有原碼兩種表示形式。
?、?原碼表示方法的優(yōu)點(diǎn),是在數(shù)的真值和它的原碼表示之間的對(duì)應(yīng)關(guān)系簡單,相互轉(zhuǎn)換容易,用原碼實(shí)現(xiàn)乘除運(yùn)算的規(guī)則簡單。缺點(diǎn)是用原碼實(shí)現(xiàn)加減運(yùn)算很不方便。要比較參與加減運(yùn)算兩個(gè)數(shù)的符號(hào),要比較兩個(gè)數(shù)的絕對(duì)值的大小,還要確定運(yùn)算結(jié)果的正確的符號(hào)等,因此在計(jì)算機(jī)中經(jīng)常用后面介紹的補(bǔ)碼實(shí)現(xiàn)加減運(yùn)算。
(2) 補(bǔ)碼表示法,是用機(jī)器數(shù)的最高一位代表符號(hào),以下各位給出數(shù)值按2取模結(jié)果的表示方法,其定義為
[X]補(bǔ)= (2.10)
例如:
X=+0.1011, [X]補(bǔ)=01011
X=-0.1011, [X]補(bǔ)=10101
按補(bǔ)碼的定義,當(dāng)X=-0.1011時(shí),[X]補(bǔ) = 2+X =10.0000+(-0.1011) = 10101。
補(bǔ)碼的性質(zhì):
?、?在補(bǔ)碼表示中,機(jī)器數(shù)的最高一位是符號(hào)位,0代表正號(hào),1代表負(fù)號(hào)。機(jī)器數(shù)和它的真值的關(guān)系,是 [X]補(bǔ) = 2*符號(hào)位 + X。
?、?在補(bǔ)碼表示中,0有唯一的編碼,即 [+0.0]補(bǔ) = [-0.0]補(bǔ) = 00000
假定X = +0.0000, Y = -0.0000,依據(jù)補(bǔ)碼定義, 則有
[X]補(bǔ) = X = 00000, [Y]補(bǔ)= 2+Y = 10.0000+0.0000 = 10.0000 = 00000
此處最后一步實(shí)現(xiàn)按2取模,處在小數(shù)點(diǎn)左側(cè)第二位上的1去掉了。
?、?補(bǔ)碼表示的兩個(gè)數(shù)在進(jìn)行加法運(yùn)算時(shí),可以把符號(hào)位與數(shù)值位同等處理,只要結(jié)果不超出機(jī)器能表示的數(shù)值范圍,運(yùn)算后的結(jié)果按2取模后,得到的新結(jié)果就是本次加法運(yùn)算的結(jié)果,即機(jī)器數(shù)的符號(hào)位與數(shù)值位都是正確的補(bǔ)碼表示,即:
[X+Y]補(bǔ) = [X]補(bǔ) + [Y]補(bǔ) MOD 2 (2.11)
這一結(jié)論極為重要。
例如, X =+0.1010, Y = -0.0101,則:
[X]補(bǔ)= 01010, [Y]補(bǔ)= 11011,求得:
[X]補(bǔ) + [Y]補(bǔ) = 01010+11011 = 100101 ,按2取模后,符號(hào)位前邊一位上的1去掉,則最后結(jié)果為00101,其真值為 +0.0101。符號(hào)位與數(shù)值位均正確。
又如,X1=X2=-0.1000,則[X1]補(bǔ)=[X2]補(bǔ) =11000 那么[X+X]補(bǔ)=11000+11000=110000,按2取模后得10000,它的真值為-1。由此看出,用補(bǔ)碼表示定點(diǎn)小數(shù)時(shí),它能表示-1的值。
?、?[X]補(bǔ)與其真值的關(guān)系。假定[X]補(bǔ)= X0X1X2…Xn,則有[X]補(bǔ)= 2X0+X,此關(guān)系對(duì)X為正、為零和為負(fù)都是正確的。X為正時(shí),X0應(yīng)為0,[X]補(bǔ)= 2*0 + X = X,X為負(fù)時(shí),X0應(yīng)為1,[X]補(bǔ) = 2*1+X = 2 + X ,均與補(bǔ)碼的定義吻合。由此又可以得到從[X]補(bǔ)求X的關(guān)系,即由機(jī)器數(shù)求其代表的真值的關(guān)系如下:
X = [X]補(bǔ) - 2X0
= X0X1X2…Xn - 2X0
= -X0 + 0.X1X2…Xn (2.12)
當(dāng)X為正數(shù)時(shí),X0=0 真值 X = [X]補(bǔ) ;
當(dāng)X為負(fù)數(shù)時(shí),X0=1 真值 X = -1 + 0.X1X2…Xn = -(1-0.X1X2…Xn)。
對(duì)補(bǔ)碼的數(shù)值部分求補(bǔ),并加上符號(hào)即得真值。
例如[X補(bǔ)=10110,則X的真值 = -(1-0.0110) = -0.1010。當(dāng)已知補(bǔ)碼而需求此數(shù)的真值時(shí)可采用此法,此公式在推導(dǎo)補(bǔ)碼乘法的運(yùn)算算法中很有用。
?、?補(bǔ)碼的算術(shù)移位
將[X] 補(bǔ)的符號(hào)位與數(shù)值位一起右移一次并保持原符號(hào)位的值不變,可實(shí)現(xiàn)除法功能(除以2),即[X/2]補(bǔ)= X0X0X1X2…Xn-1Xn。今考慮X為正、負(fù)數(shù)兩種情況。
設(shè): X= 0.0110, [X]補(bǔ)=00110,右移一位得00011,是X除以2的補(bǔ)碼結(jié)果。
設(shè): X=-0.0110,[X]補(bǔ)=11010,計(jì)算 [X/2]補(bǔ)=11101,再按④求真值得X/2=-0.0011,說明得到的確實(shí)是X除以2的結(jié)果。
為了得到一個(gè)數(shù)的補(bǔ)碼表示,當(dāng)然可以通過補(bǔ)碼的定義求得,但更簡便的辦法是:
當(dāng)X≥0時(shí),[X]補(bǔ)的符號(hào)位取0,數(shù)值位取X的各數(shù)值位上的值,此時(shí)有[X] 補(bǔ)=[X] 原。
當(dāng)X<0時(shí),[X]補(bǔ)的符號(hào)位取1,將X的各數(shù)值位取反(0變1,1變0)再在最低位加1,以得到 [X]補(bǔ)的各數(shù)值位上的值。
從[X]原求 [X] 補(bǔ)時(shí),對(duì)正數(shù)或零,有[X] 補(bǔ)=[X]原,對(duì)負(fù)數(shù),是符號(hào)位不變,各數(shù)值位變反后再在最低位執(zhí)行加1操作。同理,由[X]補(bǔ)求 [X]原時(shí),對(duì)負(fù)數(shù)仍是符號(hào)位不變,各數(shù)值位變反后再在最低位執(zhí)行加1操作。
在說明補(bǔ)碼的性質(zhì)(3)時(shí),特別強(qiáng)調(diào)兩個(gè)數(shù)的補(bǔ)碼相加,僅在其運(yùn)算結(jié)果不超出機(jī)器能表示的數(shù)值范圍時(shí),運(yùn)算結(jié)果才是正確的,否則得到的結(jié)果不正確。如[X]補(bǔ)+[Y]補(bǔ)=01001+01010=10011。兩個(gè)大于0.5的正數(shù)相加,結(jié)果的符號(hào)位變成負(fù)號(hào),數(shù)值部分也是錯(cuò)誤的。這是因此參加運(yùn)算的兩個(gè)數(shù)的和大于1,超出了機(jī)器所能表示的范圍,產(chǎn)生了所謂的 "溢出"。對(duì)負(fù)數(shù)也會(huì)產(chǎn)生溢出,如[X]補(bǔ)+[Y]補(bǔ)=10101+10100=01001,兩個(gè)負(fù)數(shù)相加,結(jié)果的符號(hào)位卻變成正號(hào),說明結(jié)果是錯(cuò)誤的。
為了方便判別結(jié)果是否溢出,某些機(jī)器采用變形補(bǔ)碼,又稱模4補(bǔ)碼表示方法,其定義為:
[X]補(bǔ)= (2.13)
也就是常說的雙符號(hào)位的補(bǔ)碼表示。例如:
X=+0.1011, [X]補(bǔ)=001011
X=-0.1011, [X]補(bǔ)=110101
按模4補(bǔ)碼定義,當(dāng)X=-0.1011時(shí),[X]補(bǔ)= 4+X = 100.0000+(-0.1011) = 110101。從上式的結(jié)果可以看出,模4補(bǔ)碼的表示就是在模2補(bǔ)碼表示的符號(hào)位之前再增加與原符號(hào)同值的另一個(gè)符號(hào)位。
模4補(bǔ)碼的性質(zhì):
① 模4補(bǔ)碼的兩個(gè)符號(hào)位相同,00表示正號(hào),11表示負(fù)號(hào),其數(shù)值位與其模2補(bǔ)碼相同。當(dāng)符號(hào)位為01或10時(shí),表示數(shù)值溢出。01表示兩個(gè)正數(shù)相加之和≥1的情況,通稱數(shù)值 "上溢";為10時(shí),表示兩個(gè)負(fù)數(shù)相加,而其和小于-1的情況,通稱數(shù)值 "下溢"。前面的1個(gè)符號(hào)位是正確的符號(hào)位。
?、?在模4補(bǔ)碼表示中,零有唯一的編碼,即 [+0.0]補(bǔ) = [-0.0]補(bǔ)= 000000。模4補(bǔ)碼能表示-1,即為110000,與模2補(bǔ)碼的情況非常類似。
模4補(bǔ)碼具有模2補(bǔ)碼的全部優(yōu)點(diǎn),而且更容易檢查加減運(yùn)算中的溢出情況。有必要指出,存儲(chǔ)每個(gè)模4的補(bǔ)碼數(shù)時(shí),只要存一個(gè)符號(hào)位,因?yàn)槿魏我粋€(gè)正確的數(shù)值,其模4補(bǔ)碼的兩個(gè)符號(hào)位總是相同的。只在把兩個(gè)模4補(bǔ)碼的數(shù)送往算術(shù)與邏輯運(yùn)算部件完成加減計(jì)算時(shí),才把每個(gè)數(shù)的符號(hào)位的值同時(shí)送到算術(shù)與邏輯運(yùn)算部件的兩位符號(hào)位,即只在算術(shù)與邏輯運(yùn)算部件中采用雙符號(hào)位。
3) 反碼表示法,是用機(jī)器數(shù)的最高一位代表符號(hào),數(shù)值位是對(duì)負(fù)數(shù)值各位取反的表示方法,其定義為
[X]反 = (2.14)
例如, X=+0.1011, [X]反 =01011
X=-0.1011, [X]反 =10100
正數(shù)的反碼與其原碼、補(bǔ)碼相同。
反碼的性質(zhì):
?、?在反碼表示中,機(jī)器數(shù)最高位為符號(hào)位,0代表正號(hào),1代表負(fù)號(hào),負(fù)數(shù)的機(jī)器數(shù)和它的真值之間的關(guān)系為:
[X]反 = ((2-2-n)+X) MOD(2-2-n)
用反碼進(jìn)行兩數(shù)相加時(shí),若最高位有進(jìn)位,還必須把該進(jìn)位值加到結(jié)果的最低位,才能得到真正的結(jié)果,這一操作通稱 "循環(huán)進(jìn)位"。
X= +0.1011, Y=-0.0100,有[X]反 =01011, [Y]反 =11011,
[X+Y]反 = [X]反 + [Y]反 = 01011 + 11011 = 100110,最高位有進(jìn)位,要加到結(jié)果的最低位,得 00110 + 00001 = 00111,即 +0.0111。
又如, X= +0.1011, Y= +0.0100,[X+Y]反 = [X]反 + [Y]反 = 01011+00100=01111,最高位無進(jìn)位值,得到的已是最終結(jié)果。
② 在反碼表示中,零有兩個(gè)編碼,即
[+0.0]反 = 00000 , [-0.0]反 = 11111
有人也稱反碼為1的補(bǔ)碼(One's Complement),它的實(shí)際模為2-2-n。這里的-n為最低位的位序號(hào)。
用反碼實(shí)現(xiàn)算術(shù)運(yùn)算不方便,0值又有兩個(gè)編碼,用得不很普遍。
評(píng)論