1.3.1 真值與機(jī)器數(shù)
上述討論的過程中都沒有考慮二進(jìn)制數(shù)的符號(hào),一般認(rèn)為其為正數(shù),但在算術(shù)運(yùn)算過程中,總會(huì)出現(xiàn)負(fù)數(shù)。實(shí)際上不帶符號(hào)的數(shù)是數(shù)的絕對(duì)值,在絕對(duì)值前加上表示正負(fù)的符號(hào)(+/- )就成了帶符號(hào)數(shù)。它可由兩部分組成:一部分是表示數(shù)的符號(hào),另一部分是表示數(shù)的數(shù)值。由于數(shù)的符號(hào)是一個(gè)具有正、負(fù)兩種值的離散信息,所以它可以用一位二進(jìn)制數(shù)來表示。通常是以0表示正數(shù),以1表示負(fù)數(shù)。對(duì)于一個(gè)n位二進(jìn)制數(shù),如果數(shù)的第一位為符號(hào)位,那么余下的n-1位就表示數(shù)的數(shù)值部分。
一般,直接用正號(hào)“+”和負(fù)號(hào)“-”來表示符號(hào)的二進(jìn)制數(shù),稱為符號(hào)數(shù)的真值。數(shù)的真值形式是一種原始形式,無法直接用在數(shù)字計(jì)算機(jī)中。但是,當(dāng)將符號(hào)數(shù)值化之后,便可以在計(jì)算機(jī)中使用它了。因此在計(jì)算機(jī)中使用的符號(hào)數(shù)便稱為機(jī)器數(shù)。
如二進(jìn)制正數(shù)+1011在機(jī)器中的表示為01011,二進(jìn)制負(fù)數(shù)-1011在機(jī)器中的表示為11011。
通過前面介紹的二進(jìn)制數(shù)的加、減、乘、除四種運(yùn)算可知,乘法運(yùn)算實(shí)際上是做左移加法運(yùn)算,而除法運(yùn)算則是做右移位減法運(yùn)算。即在機(jī)器中只需要做加、減兩種運(yùn)算。但在做減法運(yùn)算時(shí),必須先比較兩個(gè)數(shù)絕對(duì)值的大小,再將絕對(duì)值大的數(shù)減絕對(duì)值小的數(shù),最后在相減結(jié)果的前面加上絕對(duì)值較大的數(shù)的符號(hào)。因此,雖然邏輯電路可以實(shí)現(xiàn)減法運(yùn)算,但所需的電路復(fù)雜,運(yùn)算速度較作加法慢得多。為了能使減法運(yùn)算變成加法運(yùn)算,人們給出了三種機(jī)器數(shù)的表示形式,即原碼、反碼和補(bǔ)碼。
1.3.2 原碼
原碼又被稱為“符號(hào)—數(shù)值表示”。用當(dāng)原碼形式表示正數(shù)和負(fù)數(shù)的,第1位是符號(hào)位。對(duì)于正數(shù),符號(hào)位表示的0,對(duì)于負(fù)數(shù),符號(hào)位表示的1,其余各位表示數(shù)值部分。
假如兩個(gè)帶符號(hào)的二進(jìn)制數(shù)分別為S1和S2,其真值形式為
S1= +11001 S2= -01011
則S1和S2的原碼表示形式為
[S1]原= 011001 [S2]原= 101011
根據(jù)上述原碼形成規(guī)則,一個(gè)n位的整數(shù)S (包括一位符號(hào)位)的原碼一般表達(dá)式為
(1.3.1)
對(duì)于定點(diǎn)小數(shù)而言,一般將小數(shù)點(diǎn)定在最高位的左邊,此時(shí),數(shù)值小于1。定點(diǎn)小數(shù)原碼一般表達(dá)式為
(1.3.2)
由原碼的一般表達(dá)式中可以得出:
(1 )當(dāng)S為正數(shù)時(shí),[S]原和S的區(qū)別只是增加一位用0表示的符號(hào)位。由于在數(shù)的左邊增加一位0對(duì)該數(shù)的數(shù)值并無影響,所以[S]原就是S本身。
(2 )當(dāng)S為負(fù)數(shù)時(shí),[S]原和S的區(qū)別是增加了一位用1表示的符號(hào)位。
(3 )在原碼表示中,有兩種不同形式的0,即
[+0]原= 0.00…0
[- 0]原= 1.00…0
1.3.3 反碼
反碼又稱為“對(duì)1的補(bǔ)數(shù)”。當(dāng)用反碼表示時(shí),左邊第1位即為符號(hào)位,符號(hào)位為0代表正數(shù),符號(hào)位為1代表負(fù)數(shù)。對(duì)于正數(shù),反碼和原碼相同。而對(duì)于負(fù)數(shù),反碼的數(shù)值是將原碼數(shù)值按位求反,即原碼的某位為1,則反碼的相應(yīng)位便為0,或者原碼的某位為0,反碼的相應(yīng)位便為1。所以,反碼數(shù)值的形成與它的符號(hào)位有關(guān)。
假如兩個(gè)帶符號(hào)的二進(jìn)制數(shù)分別為S1和S2,其真值形式為
S1= +1l001 S2= -01011
則S1和S2的反碼表示形式為
[S1]反= 011001 [S2]反= 110100
根據(jù)上述的反碼形成規(guī)則,一個(gè)n位的整數(shù)S (包括一位符號(hào)位)的反碼一般表達(dá)式為
(1.3.3)
同樣,對(duì)于定點(diǎn)小數(shù),如果小數(shù)部分的位數(shù)為m,則它的反碼一般表達(dá)式為
(1.3.4)
從反碼的一般表達(dá)式可以看出:
(1 )正數(shù)S的反碼[S]反與原碼[S]原相同。
(2 )對(duì)于負(fù)數(shù)S,其反碼[S]反的符號(hào)位為1,數(shù)值部分是將原碼數(shù)值按位求反。
(3 )在反碼表達(dá)式中,0的表示有兩種不同的形式,即
[+0]反= 0.00…0
[-0]反= 1.11…1
1. 3. 4 補(bǔ)碼
補(bǔ)碼又稱為“對(duì)2的補(bǔ)數(shù)”。在補(bǔ)碼表示方法中,正數(shù)的表示同原碼和反碼的表示是一樣的,而負(fù)數(shù)的表示卻不相同。對(duì)于負(fù)數(shù),將原碼轉(zhuǎn)變成補(bǔ)碼的規(guī)則是:符號(hào)位不變,仍為l,數(shù)值部分變反加1,即逐位變反,在最低位加1。
如兩個(gè)帶符號(hào)的二進(jìn)制數(shù)分別為S1和S2,其真值表達(dá)式為
S1= +11001 S2= -01011
則S1和S2的補(bǔ)碼表示形式為
[S1]補(bǔ)= 011001 [S2]補(bǔ)= 110101
根據(jù)上述補(bǔ)碼形成規(guī)則,一個(gè)n位的整數(shù)S (包括一位符號(hào)位)的補(bǔ)碼一般表達(dá)式為
(1.3.5)
同樣,對(duì)于定點(diǎn)小數(shù),補(bǔ)碼一般表達(dá)式可寫成
(1.3.6)
由補(bǔ)碼的一般表達(dá)式可以看出:
(1 )正數(shù)S的補(bǔ)碼[S]補(bǔ)、反碼[S]反和原碼[S]原是相同的
(2 )對(duì)于負(fù)數(shù),補(bǔ)碼[S]補(bǔ)的符號(hào)位為1,其數(shù)值部分為反碼的數(shù)值末位加1。
(3 )在補(bǔ)碼表示法中,0的表示形式是唯一的。即
[+0]補(bǔ)= 0.00…0
[-0]補(bǔ)= 0.00…0
1. 3. 5 機(jī)器數(shù)的運(yùn)算
前面介紹了帶符號(hào)數(shù)的三種表示法,由于形成規(guī)則不同,加、減運(yùn)算的規(guī)律也不相同。下面分別加以介紹。
一、原碼運(yùn)算
原碼中的符號(hào)位僅用來表示數(shù)的正、負(fù),不參加運(yùn)算。進(jìn)行運(yùn)算的只是數(shù)值部分。原碼運(yùn)算時(shí),應(yīng)首先比較兩個(gè)數(shù)的符號(hào),若兩數(shù)的符號(hào)相同,則可將兩個(gè)數(shù)的數(shù)值相加,最后給結(jié)果附上相應(yīng)的符號(hào);若兩數(shù)的符號(hào)不同,則需比較兩數(shù)的數(shù)值大小,然后將數(shù)值較大的數(shù)減去數(shù)值較小的數(shù),并將數(shù)值較大的數(shù)的符號(hào)作為最后結(jié)果的符號(hào)。下面舉例說明。
例1.3.1 已知S1= 0.1001,S2= -0.0101,求[S2+S1 ]原和[S2-S1]原。
解: [S2+S1]原= [ (-0.0101 )+ (0.1001 )]原
由于S1和S2的符號(hào)不同,并且的S1絕對(duì)值大于S2的絕對(duì)值,因此要進(jìn)行S1減S2的運(yùn)算,其結(jié)果為正。

運(yùn)算結(jié)果為原碼,即
[S2+S1]原= 0.0100
故其真值為
S2+S1= 0.0100
又 [S2-S1]原= [ (-0.0101 )- (0.1001 )]原
由于S1和S2的符號(hào)相同,因此,實(shí)際上要進(jìn)行Sl加S2的運(yùn)算,其結(jié)果為負(fù)。
![]()
運(yùn)算結(jié)果為原碼,即
[S2-S1]原= 1.1101
故其真值為
S2-S1 = -0.1101
二、反碼運(yùn)算
由反碼的定義可以得到反碼加、減運(yùn)算規(guī)則如下:
[S2+S1]反= [S2]反+[S1]反
[S2-S1]反= [S2]反+[-S1]反
反碼的加、減運(yùn)算規(guī)則表明:兩數(shù)和的反碼等于兩數(shù)的反碼之和,而兩數(shù)差的反碼也可以用加法來實(shí)現(xiàn)。運(yùn)算時(shí),符號(hào)位和數(shù)值位一樣參加運(yùn)算,如果符號(hào)位產(chǎn)生進(jìn)位,則需將此進(jìn)位加到和數(shù)的最低位,稱之為“循環(huán)進(jìn)位”。運(yùn)算結(jié)果的符號(hào)位為0時(shí),說明是正數(shù)的反碼,與原碼相同;運(yùn)算結(jié)果的符號(hào)位為1時(shí),說明是負(fù)數(shù)的反碼,應(yīng)再對(duì)運(yùn)算結(jié)果求反碼,才得到原碼。下面舉例說明。
例1.3.2 已知S1= 0.1001,S2= -0.0101,求[S2+S1]反和[S2-S1]反。
解: [S2+S1]反= [S2]反+ [S1]反= 1.1010+0.1001

由于符號(hào)位產(chǎn)生了進(jìn)位,因此要進(jìn)行“循環(huán)進(jìn)位”,即
[S2+S1]反= 0.0100
由于其符號(hào)位為0,則其真值為S2+S1= 0.0100
又 [S2-S1]反= [S2]反+ [-S1]反= 1.1010+1.0110

由于符號(hào)位產(chǎn)生了進(jìn)位,因此要進(jìn)行“循環(huán)進(jìn)位”,即
[S2-S1]反= 1.0001
由于其符號(hào)位為1,則其真值為S2-S1= -0.1110
三、補(bǔ)碼運(yùn)算
補(bǔ)碼運(yùn)算同反碼運(yùn)算一樣,兩數(shù)差的補(bǔ)碼可以用兩數(shù)補(bǔ)碼的加法來實(shí)現(xiàn)。補(bǔ)碼加、減運(yùn)算規(guī)則是:
[S2+S1]補(bǔ)= [S2]補(bǔ)+[S1]補(bǔ)
[S2-S1]補(bǔ)= [S2]補(bǔ)+[-S1]補(bǔ)
運(yùn)算時(shí),符號(hào)位和數(shù)值位一樣參加運(yùn)算,如果符號(hào)位產(chǎn)生了進(jìn)位,則此進(jìn)位可“略去”。運(yùn)算結(jié)果符號(hào)位為0時(shí),說明是正數(shù)的補(bǔ)碼,與原碼相同。運(yùn)算結(jié)果符號(hào)位為l,說明是負(fù)數(shù)的補(bǔ)碼,應(yīng)對(duì)結(jié)果再求補(bǔ)碼才得原碼。
下面舉例說明。
例1.3.3 已知S1= 0.1001,S2= -0.0101,求[S2+S1]補(bǔ)和[S2-S1]補(bǔ)。
解: [S2+S1]補(bǔ)= [S2]補(bǔ)+[S1]補(bǔ)= 1.1011+0.1001

由于符號(hào)位產(chǎn)生了進(jìn)位,因此,要將此進(jìn)位略去,即
[S2+S1]補(bǔ)= 0.0100
運(yùn)算結(jié)果的符號(hào)位為0,說明是正數(shù)的補(bǔ)碼,補(bǔ)碼與原碼相同。
由于其符號(hào)位為0,則其真值為
S2+S1= 0.0100
又 [S2-S1]補(bǔ)= [S2]補(bǔ)+[-S1]補(bǔ)= 1.1011+1.0111

由于符號(hào)位產(chǎn)生了進(jìn)位,因此,要將此進(jìn)位略去,即
[S2-S1]補(bǔ)= 1.0010
運(yùn)算結(jié)果的符號(hào)位為1,說明是負(fù)數(shù)的補(bǔ)碼,應(yīng)對(duì)補(bǔ)碼求補(bǔ)后才能得到原碼,即
[S2-S1]原= 1.1110
由于其符號(hào)位為1,則其真值為
S2-S1= -0.1110
從上述的討論可以看出,原碼、反碼和補(bǔ)碼各有優(yōu)缺點(diǎn)。原碼表示法簡(jiǎn)單方便,但原碼減法必須做真正的減法,不能用加法來代替,因此實(shí)現(xiàn)原碼運(yùn)算所需的邏輯電路比較復(fù)雜。反碼和補(bǔ)碼的優(yōu)點(diǎn)是只需用加法邏輯電路便可實(shí)現(xiàn)。并且用補(bǔ)碼進(jìn)行減法運(yùn)算很方便,它只需進(jìn)行一次算術(shù)相加。而用反碼進(jìn)行減法運(yùn)算,若符號(hào)位產(chǎn)生進(jìn)位就需進(jìn)行兩次算術(shù)相加。而且反碼還有一個(gè)缺點(diǎn),就是具有兩個(gè)零值,這容易在計(jì)算過程中產(chǎn)生歧意。
