計算機組成原理 - 第二章 - 運算方法和運算器
1 數據與文字的表示方法
主要分為兩種,定點數和浮點數。
1.1 定點數:
約定機器中所有數據的小數點位置是固定不變的。由於約定在固定的位置,小數點就不再用記號.
表示。通常將定點數表示成純小數或純整數。
假設用n+1位字來表示一個定點數x,其中一位\(x_n\)用來表示數符,其余位數代表量值。為了將n+1位統一處理,符號位\(x_n\)放最左側位置,用0和1分別表示正號和負號。
如果數x表示純小數,其小數點位於\(x_n\)和\(x_{n-1}\)之間。
如果數x表示純整數,其小數點位於\(x_0\)之后
下面來分析定點數的數值范圍:
應該將數符與尾數分開看。尾數表示該數的絕對值大小,尾數最大即全1,最小即全0。當數符為0時,為正數;數符為1時,為負數。
對於定點整數:$ 0 \leq |x| \leq 2^n-1$
對於定點小數:\(0 \leq |x| \leq 1-2^{-n}\)
1.2 浮點數:
浮點表示法,實際上是采用類似於科學計數法的形式來表示數字的一種方法,一個數\(N\)可以寫作\(N = 2^e .M\)。在計算機中,一個機器浮點數由階碼和尾數及其符號位組成:
其中:
- \(E_s\)表示階符
- \(E_{m-1}~E_0\)表示階碼
- \(M_s\)表示數符
- \(M_{n-1}...M_0\)表示尾數
1.3 數的機器碼表示
- 原碼:正數\(x_{原} = x\) ,負數\(x_{原} = 2^n + |x|\)(即符號位為1)
- 反碼:正數\(x_反=x\),負數\(x_{反} = x_{原}\)符號位不變,其余按位取反
- 補碼:正數\(x_補 = x\),負數\(x_補 = x_反\)+1
1.4 浮點數的機器表示
當前的計算機都采用統一的IEEE754標准中的格式表示浮點數。IEEE754標准規定的32位短浮點數和64位長浮點數的標准格式為:
-
32位短浮點數:
若不對浮點數的表示做出明確規定,同一個浮點數的表示就不是唯一的,為了提高數據的表示精度,當尾數的值不為0時,尾數域的最高有效位應為1,這稱為浮點數的規格化表示。
在IEEE754標准中,一個規格化32位浮點數x的真值表示為
\[x = (-1)^S \times (1.M) \times 2^{E-127} \]此外,IEEE754還有一些特殊定義:
- 若E=255且M<>0,則N = NaN
- 若E=255且M=0,則N=\((-1)^S\infin\)
- 若E=0且M=0,則N=\((-1)^S0\)
- 若0<E<255,則N為規格化數
- 若E=0且M<>0,則N=\((-1)^S\times(0.M)\times 2^{E-1023}\) 非規格化數
1.5 補碼運算
-
補碼加法:
加法的公式:\([x]_{補}+[y]_{補}=[x+y]_補\)
- 符號位要作為數的一部分一起參與運算
- 超過符號位的進位要丟掉
-
補碼減法:
減法的公式:\([x]_{補}-[y]_{補}=[x]_補+[-y]_補\)
由\([y]_{補}\)求\([-y]_{補}\)的法則是:對\([y]_{補}\)包括符號位按位取反再+1
1.6 溢出
分為上溢(運算結果大於最大正數)和下溢(運算結果小於最小負數)
溢出判別法:
- 進位判別法:判斷最高位的進位和符號位的進位是否相同。(即,如果符號位一開始全為0,那么最高位就不得進位;如果符號位一開始全為1,那么最高位就應該進位)
- 采用變形補碼,即符號位為兩位,正數為00,負數為11,如果運算后得到01或10則發生溢出。
2 運算器設計
2.1 加法器
一位全加器:
延遲運算: 與門、或門 1T;異或門3T
行波進位的補碼加法/減法器

這里簡單分析一下:當M=0時,B數各位經過0異或保持原數B不變,最低位進位為0,結果就是A與B相加;當M=1時,B數各位經過1異或取反,再結合最低位的進位1,結果就是A+(-B)= A-B。
2.2 定點乘法
在定點計算機中,兩個原碼表示的數相乘的運算規則是:乘積的符號位由兩數的符號位按異或運算得到,而乘積的數值部分則是兩個正數相乘之積。
介於串行乘法器已經被淘汰,下面只介紹並行乘法器。並行乘法器的關鍵是快速產生n*n個位積,然后對位積進行相加運算產生n+n-1個列和。
並行乘法器第一步是並行計算n*n個位積,為此需要n*n個與門;第二步是利用n*(n-1)個全加器計算列和。

2.2.1 間接補碼乘法運算
由於在計算機內數據是以補碼形式存在,必須考慮補碼乘法運算中由補碼、原碼之間簡便的互換運算
由補碼直接求原碼的運算:
正數的補碼不變,負數的補碼等於從右邊開始遇到的第一個真值的1以后除了符號位以外1變0,0變1。
求補電路的思想:
如果符號位是0,數據不變
如果符號位是1,則符號位保持不變,數據位從lowbit(x)左邊除符號位以外全部求反。

串聯的或門陸續接受來自低位的數字和上一次的或門輸出,一旦某一次低位數字為1,這一次的或門輸出及后續的或門輸出均為1。每一級的或門輸出都會與使能端E相與,當使能端E=1時,簡化為直接由或門輸出控制。與門輸出接異或門,當或門為1,E=1時,異或門發揮求反功能。當使能端為0時,各級異或門均為0,不發揮求反功能,即各位均保持不變。因此,可以將使能端接數的符號位。
間接補碼乘法器,即先將兩個數經過算前求補器轉化為原碼,然后經過乘法器,再將結果經過算后求補器轉化為補碼。

2.2.2 直接補碼乘法運算

根據這一特點,我們可以設計輸入帶有負權的加法器,用來構造直接補碼並行乘法器。根據帶有負權的輸入端數量,可以分為0,1,2,3四類加法器。用混合加法器構造出的並行乘法器如下圖:

3 浮點運算方法和浮點運算器
浮點數的加減法運算分為六個步驟:
-
0操作數檢查
兩個操作數中有一個為0,則無需運算
-
比較階碼大小並完成對階
兩個浮點數進行加減,首先要看兩數的階碼是否相同。如果兩數階碼不同,表示小數點位置沒有對齊,此時必須使二數階碼相同,這個過程稱為對階。對階操作規定使尾數右移,尾數右移后階碼作相應的增加;因此,對階時總是小階向大階看齊。
-
尾數加減運算
與定點運算一致
-
結果規格化
分為左規和右規。這是根據尾數左移和右移來區分的。
-
舍入處理
在對階向右規格化,尾數向右移位,這樣被右移的尾數的低位部分會被丟掉,從而造成一定誤差,要進行舍入處理。
-
判斷結果是否溢出

4 總結
