天天看點

如何用計算機二進制進行計算,計算機如何實作二進制資料運算

如何用計算機二進制進行計算,計算機如何實作二進制資料運算

正數的原碼,補碼,反碼都相同,都等于它本身

負數的補碼是:符号位為1,其餘各位求反,末位加1

反碼是:符号位為1,其餘各位求反,但末位不加1

也就是說,反碼末位加上1就是補碼

1. 定點小數的編碼方法

用定點小數引出數值的三種編碼(原碼、補碼和反碼)方法是最友善的。

(1) 原碼表示法,是用機器數的最高一位代表符号,以下各位給出數值絕對值的表示方法。其定義為:

[X]原= (2.9)

例如, X=+0.1011, [X]原=01011

X=-0.1011, [X]原=11011

按定義,當X=-0.1011時,[X]原= 1-X= 1.0000-(-0.1011) =11011。這裡的X為數的實際值,即相應機器數的真值,[X]原為原碼表示的機器數。

原碼的性質:

① 在原碼表示中,機器數的最高位是符号位,0代表正号,1代表負号,以下各位是數的絕對值,即[X]原 = 符号位 + |X|。

② 在原碼表示中,零有兩種表示形式,即

[+0.0]原=00000, [-0.0]原=10000

設X、Y的真值分别為X=+0.0000,Y=-0.0000。則按原碼定義[X]原=00000, [Y]原= 1-Y = 1+0.0000 = 10000,是以零有原碼兩種表示形式。

③ 原碼表示方法的優點,是在數的真值和它的原碼表示之間的對應關系簡單,互相轉換容易,用原碼實作乘除運算的規則簡單。缺點是用原碼實作加減運算很不友善。 要比較參與加減運算兩個數的符号,要比較兩個數的絕對值的大小,還要确定運算結果的正确的符号等,是以在計算機中經常用後面介紹的補碼實作加減運算。

在數軸上的表示:

(2) 補碼表示法,是用機器數的最高一位代表符号,以下各位給出數值按2取模結果的表示方法,其定義為

[X]補=2.10)

例如:

X=+0.1011, [X]補=01011

X=-0.1011, [X]補=10101

按補碼的定義,當X=-0.1011時,[X]補 = 2+X =10.0000+(-0.1011) = 10101。

補碼的性質:

① 在補碼表示中,機器數的最高一位是符号位,0代表正号,1代表負号。機器數和它的真值的關系,是 [X]補 = 2*符号位 + X。

② 在補碼表示中,0有唯一的編碼,即 [+0.0]補 = [-0.0]補 = 00000

假定X = +0.0000, Y = -0.0000,依據補碼定義, 則有

[X]補 = X = 00000, [Y]補= 2+Y = 10.0000+0.0000 = 10.0000 = 00000

此處最後一步實作按2取模,處在小數點左側第二位上的1去掉了。

③ 補碼表示的兩個數在進行加法運算時,可以把符号位與數值位同等處理,隻要結果不超出機器能表示的數值範圍,運算後的結果按2取模後,得到的新結果就是本次加法運算的結果,即機器數的符号位與數值位都是正确的補碼表示,即:

[X+Y]補 = [X]補 + [Y]補 MOD 2 (2.11)

這一結論極為重要。

例如, X =+0.1010, Y = -0.0101,則:

[X]補= 01010, [Y]補= 11011,求得:

[X]補 + [Y]補 = 01010+11011 = 100101 ,按2取模後,符号位前邊一位上的1去掉,則最後結果為00101,其真值為 +0.0101。符号位與數值位均正确。

又如,X1=X2=-0.1000,則[X1]補=[X2]補 =11000 那麼[X+X]補=11000+11000=110000,按2取模後得10000,它的真值為-1。由此看出,用補碼表示定點小數時,它能表示-1的值。

④ [X]補與其真值的關系。假定[X]補= X0X1X2…Xn,則有[X]補= 2X0+X,此關系對X為正、為零和為負都是正确的。X為正時,X0應為0,[X]補= 2*0 + X = X,X為負時,X0應為1,[X]補 = 2*1+X = 2 + X ,均與補碼的定義吻合。由此又可以得到從[X]補求X的關系,即由機器數求其代表的真值的關系如下:

X = [X]補 - 2X0

= X0X1X2…Xn - 2X0

= -X0 + 0.X1X2…Xn (2.12)

當X為正數時,X0=0 真值 X = [X]補 ;

當X為負數時,X0=1 真值 X = -1 + 0.X1X2…Xn = -(1-0.X1X2…Xn)。

對補碼的數值部分求補,并加上符号即得真值。

例如[X補=10110,則X的真值 = -(1-0.0110) = -0.1010。當已知補碼而需求此數的真值時可采用此法,此公式在推導補碼乘法的運算算法中很有用。

⑤ 補碼的算術移位

将[X] 補的符号位與數值位一起右移一次并保持原符号位的值不變,可實作除法功能(除以2),即[X/2]補= X0X0X1X2…Xn-1Xn。今考慮X為正、負數兩種情況。

設: X= 0.0110, [X]補=00110,右移一位得00011,是X除以2的補碼結果。

設: X=-0.0110,[X]補=11010,計算 [X/2]補=11101,再按④求真值得X/2=-0.0011,說明得到的确實是X除以2的結果。

為了得到一個數的補碼表示,當然可以通過補碼的定義求得,但更簡便的辦法是:

當X≥0時,[X]補的符号位取0,數值位取X的各數值位上的值,此時有[X] 補=[X] 原。

當X<0時,[X]補的符号位取1,将X的各數值位取反(0變1,1變0)再在最低位加1,以得到 [X]補的各數值位上的值。

從[X]原求 [X] 補時,對正數或零,有[X] 補=[X]原,對負數,是符号位不變,各數值位變反後再在最低位執行加1操作。同理,由[X]補求 [X]原時,對負數仍是符号位不變,各數值位變反後再在最低位執行加1操作。

在說明補碼的性質(3)時,特别強調兩個數的補碼相加,僅在其運算結果不超出機器能表示的數值範圍時,運算結果才是正确的,否則得到的結果不正确。如 [X]補+[Y]補=01001+01010=10011。兩個大于0.5的正數相加,結果的符号位變成負号,數值部分也是錯誤的。這是是以參加運算的兩個數的和大于1,超出了機器所能表示的範圍,産生了所謂的 "溢出"。對負數也會産生溢出,如[X]補+[Y]補=10101+10100=01001,兩個負數相加,結果的符号位卻變成正号,說明結果是錯誤的。

為了友善判别結果是否溢出,某些機器采用變形補碼,又稱模4補碼表示方法,其定義為:

[X]補= (2.13)

也就是常說的雙符号位的補碼表示。例如:

X=+0.1011, [X]補=001011

X=-0.1011, [X]補=110101

按模4補碼定義,當X=-0.1011時,[X]補= 4+X = 100.0000+(-0.1011) = 110101。從上式的結果可以看出,模4補碼的表示就是在模2補碼表示的符号位之前再增加與原符号同值的另一個符号位。

模4補碼的性質:

① 模4補碼的兩個符号位相同,00表示正号,11表示負号,其數值位與其模2補碼相同。當符号位為01或10時,表示數值溢出。01表示兩個正數相加之和≥1的情況,通稱數值 "上溢";為10時,表示兩個負數相加,而其和小于-1的情況,通稱數值 "下溢"。前面的1個符号位是正确的符号位。

② 在模4補碼表示中,零有唯一的編碼,即 [+0.0]補 = [-0.0]補= 000000。模4補碼能表示-1,即為110000,與模2補碼的情況非常類似。

模4補碼具有模2補碼的全部優點,而且更容易檢查加減運算中的溢出情況。有必要指出,存儲每個模4的補碼數時,隻要存一個符号位,因為任何一個正确的數值,其模4補碼的兩個符号位總是相同的。隻在把兩個模4補碼的數送往算術與邏輯運算部件完成加減計算時,才把每個數的符号位的值同時送到算術與邏輯運算部件的兩位符号位,即隻在算術與邏輯運算部件中采用雙符号位。

在數軸上的表示:

(3) 反碼表示法,是用機器數的最高一位代表符号,數值位是對負數值各位取反的表示方法,其定義為

[X]反 = (2.14)

例如, X=+0.1011, [X]反 =01011

X=-0.1011, [X]反 =10100

正數的反碼與其原碼、補碼相同。

反碼的性質:

① 在反碼表示中,機器數最高位為符号位,0代表正号,1代表負号,負數的機器數和它的真值之間的關系為:

[X]反 = ((2-2-n)+X) MOD(2-2-n)

用反碼進行兩數相加時,若最高位有進位,還必須把該進位值加到結果的最低位,才能得到真正的結果,這一操作通稱 "循環進位"。

X= +0.1011, Y=-0.0100,有[X]反 =01011, [Y]反 =11011,

[X+Y]反 = [X]反 + [Y]反 = 01011 + 11011 = 100110,最高位有進位,要加到結果的最低位,得 00110 + 00001 = 00111,即 +0.0111。

又如, X= +0.1011, Y= +0.0100,[X+Y]反 = [X]反 + [Y]反 = 01011+00100=01111,最高位無進位值,得到的已是最終結果。

② 在反碼表示中,零有兩個編碼,即

[+0.0]反 = 00000 , [-0.0]反 = 11111

有人也稱反碼為1的補碼(One's Complement),它的實際模為2-2-n。這裡的-n為最低位的位序号。

用反碼實作算術運算不友善,0值又有兩個編碼,用得不很普遍。

在數軸上的表示:

2. 整數的編碼方法

與定點小數的三種編碼方法類似,整數也可以用原碼、補碼和反碼三種不同的編碼方法表示。差別主要表現在:

定點小數的小數點位置嚴格地設定在數的符号位與最高數值位之間,是以,數的表示範圍和編碼的取模值與用多少位二進制表示一個數無關,該位數隻影響數值的精度。可以認為整數是小數點被設定在最低一位數值位的右邊, 機器數的最高位仍被用作數的符号位。

數值的表示範圍,以及整數編碼的取模值,都與表示一個數所用的二進制位數有關。

整數三種編碼的定義、特性和互相間的變換方法,均與定點小數相應的三種表示類似,隻是補碼的取模值為2k+1 或2k+2 (對變形補碼),這裡的k為二進制整數數值位的位數。例如, X=+10101 [X]原 =[X]補 =[X]反 =010101

X=-10101 [X]原 =110101

[X]補 =101011

[X]反 =101010

以上兩個數的變形補碼分别為0010101和1101011。這裡的K均為5。

3. 浮點數常用的編碼方法

前面已經說到,在計算機内,浮點數被表示為如下格式:

通常情況下,數的符号位Ms,仍然采用0表示正号、1表示負号的規則。數的尾數部分M采用定點小數形式表示,可用原碼(或補碼)等編碼方式。讨論浮點數的編碼方法的關鍵,是确定對階碼部分的編碼方法。

在多數通用計算機中,浮點數的階碼部分多采用整數形式的移碼表示。對由1位符号位和n位數值位組成的二進制形式的階碼,其移碼的定義為:

[X] 移 = 2n + X -2-n ≤ X < 2n              (2.15)

将這一定義與整數補碼的定義相比較,

[X]補 =(2.16 )

在數軸上的表示:

就可找出移碼和補碼之間的如下關系:

當 0 ≤ X < 2 n 時,[X]移= 2 n + X = 2 n + [X]補

-2 n≤ X < 0 時,[X]移= 2n + X = (2n+1 + X) - 2n

這表明,由[X]補 得到 [X]移 的方法是變 [X]補 的符号為其反碼。例如:

X = +1011, [X]補 = 01011, [X]移 = 11011

X = -1011, [X]補 = 10101, [X]移 = 00101

移碼的性質:

最高一位為符号位,但其取值與原碼和補碼都相反,1代表正号,0代表負号。

移碼隻用于表示浮點數的階碼,故隻用于整數。

對移碼一般隻執行加減運算,在對兩個浮點數進行乘除運算時,是尾數實作乘除運算,階碼執行加減運算。對移碼執行加減運算時,需要對得到的結果加以修正,修正量為2n,即要對用移碼求得的符号位取反後,得到的才是移碼形式的正确結果。

在移碼表示中,0有唯一的編碼,即 [+0]移 = [-0]移 = 1000…0。而且浮點數機器零的形式為000…000。當浮點數的階碼≤-2 n時,不管尾數值大小如何,都屬于浮點數下溢,被認為其值是0。此時,移碼表示的階碼值正好是每一位都為0的形式,這有利于簡化機器中的判0線路。

在計算機中,通常總是用補碼完成算術的加減法運算。其規則是:

[X+Y]補= [X]補 + [Y]補 ,[X-Y]補= [X]補 - [Y]補 = [X]補 + [-Y]補

這表明,有了補碼表示的被加(減)數和加(減)數,要完成計算補碼表示的二數之和或二數之差,隻需用二數的補碼直接執行加減運算即可,符号位與數值位同等對待,一起參加運算,若運算結果不溢出,即不超出計算機所能表示的範圍,則結果的符号位和數值位同時為正确值。此外,還可以看到,實作減運算時,用的仍是加法器線路,把減數的負數的補碼送加法器即可。在有了一個數的補碼之後,求這個數的負數的補碼,是簡單地把這個數的補碼逐位取反再在最低位加1即可得到。例如,[Y]補=101101,則[-Y]補=010011,這大大簡化了加減運算所用的線路和加減運算的實作算法。

下面的問題是如何檢查加減運算中的溢出問題。通常有三種表述方式(說法):

(1) 兩個符号相同的補碼數相加,如果和的符号與加數的符号相反,或兩個符号相反的補碼數相減,差的符号與減數的符号相同,都屬于運算結果溢出。這種判别方法比較複雜,要差別加還是減兩種不同運算情況,還要檢查結果的符号與其中一個操作數的符号的同異,故很少使用;

(2) 兩個補碼數相加減時,若最高數值位向符号位送的進位值與符号位送向更高位的進位值不相同,也是運算結果溢出。

(3) 在采用雙符号位(如定點小數的模4補碼)運算時,若兩個符号位的得值不同(01或10)則是溢出。01表明兩個正數相加,結果大于機器所能表示的最大正數,稱為"上溢";10表明兩個負數相加,結果小于機器所能表示的最小負數,稱為"下溢";雙符号位的高位符号位,不管結果溢出否,均是運算結果正确的符号位,這個結論在乘法運算過程中是很有實際意義的。請注意,在采用雙符号位的方案中,在寄存器和記憶體儲器存儲資料時,隻需存一位符号,雙符号位僅用在加法器線路部分。

再次強調,這三種不同說法是對同一個事實的略有差別的表述,實作時用到的線路可以有所差別,但問題的實質是完全一樣的。請看 [X]補 + [Y]補 的運算情況:

01011        10101       10100

+ 01000       + 11000      + 11001

10011       101101      101101

(1)       (2)       (3)

10111       001011      110111

+ 10101      + 001000     + 110101

101000       010011      1101100

(4)       (5)       (6)

這全都是溢出情況,前4個使用一個符号位,後2個使用二個符号位。用前面說的任何一種表述解釋這裡的溢出都是可以的。例如,對于(1),從正加正的得負,或資料位向符号位送的進位值為1,而符号位送向更高位的進位值卻為0,二者不相同,或在(5)中使用雙符号位方案時,其雙符号位結果為01,都是運算結果溢出。

凡補碼加減運算其結果不屬于上述情況的,均不是溢出,結果的符号位和數值位均正确。這裡雖然讨論的都是加法運算,對減運算亦适用。正減負等同正加正,正減正等同正加負,正如前面說過的,減運算也是用加法器完成的。例如:

01011      11101      001011     111101

+ 00100     + 11010     + 000100    + 111010

01111      10111      001111     110111

(1)      (2)       (3)      (4)

(1)、(2)使用一位符号位,(3)、(4)使用二位符号位,符号位送向更高位的進位值,不論其值為0或為1一律在取模後丢棄。

有了上述說明,就可以用圖2.5的邏輯線路完成二補碼數的加減運算。

運算前,X、Y寄存器分别存儲被加(減)數 和 加(減)數,計算結果存回X寄存器;F為加法器,能在指令X→F和Y→F信号的控制下接收兩個寄存器中的資料并完成加法運算,運算結果在F→X指令信号的控制下接收回X寄存器中

◆◆

評論讀取中....

請登入後再發表評論!

◆◆

修改失敗,請稍後嘗試