第二章 運算方法和運算器#
2.1 數制與編碼#
一、進位計數制及其相互轉換#
10 進制和 R 進制之間的轉換
R 進制到 10 進制:
∑i=n−mki×ri
eg: 二進制數轉換十進制數
//二轉十
int bToD(char str[]) {
int sum = 0;
for(int i = 0; str[i] != '\0'; i++) {
sum = sum*2 + (str[i] - '0');
}
return sum;
}
10 進制到 R 進制:
- 整數部分:除 r 取餘,r 為進制基數
- 小數部分:乘 r 取整代碼如下
//將十進制數n轉化為k進制整數
void dToK(int n, int k, char str[]) {
int i = 0;
if (n == 0) {
str[0] = '0';
return;
}
while(n) {
str[i++] =n % k + '0';
n = (n-n % k) / k;
}
i--;
//reverse
for (int j = 0; j < i; j++,i--) {
char t = str[j];
str[j] = str[i];
str[i] = t;
}
}
二、真值和機器數#
- 真值:一般書寫的數
- 機器碼:機器中表示的數,要解決在計算機內部數的正、負符號和小數點運算問題。
三、BCD 碼#
表示一位十進制數的二進制碼的每一位有確定的權。一般用 8421 碼,其 4 個二進制碼的權從高到低分別為 8、4、2 和 1。用 0000,0001,...,1001 分別表示 0,1,...,9,每個數位內部滿足二進制規則,而數位之間滿足十進制規則,故稱這種編碼為 “以二進制編碼的十進制 (binary coded decimal,簡稱 BCD) 碼”。
注意!
BCD 碼的取值是從 0000 到 1001(也就是十進制的 0 到 9)
有時對 BCD 碼進行加法或減法會有這個範圍以外的值出現,需要人工調整方能得出正確的結果。
在計算機內部實現 BCD 碼算術運算,要對運算結果進行修正,對加法運算的修規則是:
- 如果兩個一位 BCD 碼相加之和小於或等於 (1001)~2~,即 (9)~10~,不需要修正;
例1 ① 1+8 = 9
0 0 0 1
+ 1 0 0 0
——————————
1 0 0 1
不需要修正
- 如相加之和大於或等於 (10)~10~,要進行加 6 修正,並向高位進位,進位可以在首次相加 (例 1 ③) 或修正時 (例 1 ②) 產生。
例1 ② 4+9 = 13
0 1 0 0
+ 1 0 0 1
——————————
1 1 0 1
+ 0 1 1 0 修正
——————————
1 0 0 1 1
0001 0011即為13~
③ 9+7 = 16
1 0 0 1
+ 0 1 1 1
——————————
1 0 0 0 0
+ 0 1 1 0 修正
——————————
1 0 1 1 0
0001 0110即為16~
四、字符與字符串#
1、字符與字符串的表示方法#
符號數據:字符信息用數據表示,如ASCII等
字符表示方法ASCII: 用一個字節來表示,低 7 位用來編碼 (128), 最高位為校驗位,如圖
字符串的存放方法:佔用主存中連續的多個字節,每個字節存一個字符。
2、漢字的表示方法#
一級漢字 3755 個,二級漢字 3008 個
漢字內碼:漢字信息的存儲,交換和檢索的機內代碼,兩個字節組成,每個字節高位都為 1 (區別於英文字符)
漢字字模碼:漢字字形點陣
五、校驗碼(重點)#
推薦視頻3Blue1Brown 的漢明碼 part1、3Blue1Brown 的漢明碼 part2,講的非常有趣!雖然主要講漢明碼,但對奇偶校驗碼也有詳細描述。
校驗碼(只介紹奇偶校驗碼)
信息傳輸和處理過程中受到干擾和故障,容易出錯。
解決方法#
在有效信息中加入一些冗餘信息(校驗位)
設 x=(x~0~ x~1~.x~n-1~) 是一個 n 位字,則偶校驗位 C 定義為=x~0~ ^ x~1~ ^ x~2~ ^ ... ^x~n-1~, 式中 ^ 代表按位加,表明只有當 x 中包含有偶數個 1時,才使 C=0,否則 C=1。只能檢查出錯,而不能糾正錯誤。同理可以定義奇校驗。
奇校驗:包含奇數個 1 時才使得 C=0, 否則 C=1
2.2 定點數的表示和運算(重點)#
一、定點數的表示#
1、原碼表示法#
定點小數 x~n~.x~n-1~x~n-2~…..x~0~,x 為真值
\begin{cases}
x, & \text{0 ≤ x < 1 即 x為正數} \\
1-x, & \text{-1 < x ≤ 0 即 x為負數}
\end{cases}$$
範圍為2^-n^-1~1-2^-n^
eg:
x = +0.1001,[x]原 = 0.1001
x = -0.1001,[x]原 = 1-(-0.1001)=1.1001
**定點整數 x~n~x~n-1~x~n-2~…..x~0~**,x為真值
$$[x]_原 =
\begin{cases}
x, & \text{0 ≤ x < }2^n 即 x為正數\\
2^n-x, & \text{-2}^n<x≤ 0 {即x為負數}
\end{cases}$$
範圍為1-2^n^~2^n^-1
eg:
x = +1001,[x]原 = 01001
x = -1001,[x]原 = 2^4^+1001=11001
**有正0和負0之分!!**
#### 2、反碼表示法
**定義**
- **正數**的表示與原碼、補碼相同。
- **負數**的反碼**符號位為1**,**數值位**是將**原碼的數值按位取反**,就得到該數的反碼表示。
- 電路容易實現,觸發器的輸出有正負之分。
對尾數求反,反碼跟補碼的區別在於末位少加一個1,所以可以推出反碼的定義
**定點小數 x~n~.x~n-1~x~n-2~…..x~0~**,x為真值
$$[x]_反 =
\begin{cases}
x, & \text{0 ≤ x < 1 即 x為正數} \\
(2-2^{-n})+x, & \text{-1 < x ≤ 0 即 x為負數}
\end{cases}$$
eg:
X1=+0.1011011 , [X1]~反~ =0.1011011
X2= -0.1011011 , [X2]~反~ =1.0100100
**定點整數 x~n~x~n-1~x~n-2~…..x~0~**,x為真值
$$[x]_反 =
\begin{cases}
x, & \text{0 ≤ x < }2^n 即 x為正數 \\
(2^{n+1}-1)+x, & \text{-2}^n<x≤ 0 {即x為負數}
\end{cases}$$
**反碼表示有正0和負0之分!!**
#### 3、補碼表示法
**定義**
正數的補碼就是正數的本身,負數的補碼是原負數加上模(原負數除符號位外取反,再加1)。 計算機運算受字長限制,屬於有模運算。補碼最大的優點就是將減法運算轉換成加法運算。
**定點小數x~n~x~n-1~x~n-2~…..x~0~,以2為模**
$$[x]_補 =
\begin{cases}
x, & \text{0 ≤ x < 1 即 x為正數} \\
2+x, & \text{-1 < x ≤ 0 即 x為負數}
\end{cases}$$
eg: x= -0.1011,[x]~補~=10+x=10.0000-0.1011=1.0101
y=-0.01111 [y]~補~=10+y=10.00000-0.01111=1.10001
**定點整數xnxn-1xn-2…..x0 ,以2^n+1^為模**
$$[x]_補 =
\begin{cases}
x, & \text{2}^n {>x ≥ 0 即 x為正數} \\
2^{n+1}+x, & \text{0 ≥ x > -2}^n {即x為負數}
\end{cases}$$
**補碼性質:**
- 高位表明正負
- 正數補碼,尾數與原碼相同
- 範圍-2^n^~2^n^-1(定點整數)
- **無正零和負零之分!!**
#### 4、移碼表示法
用在階碼中,特點是**移碼和補碼尾數相同,符號位相反**
範圍:-2^n^~2^n^-1
eg:真值-1011111
原碼為11011111
補碼為10100001
反碼為10100000
移碼為00100001
#### 5、總結
- **若x為正數,[x]~原~ = [x]~補~ = [x]~反~**
- **若x為負數**,**原碼符號位為1不變**,整數的每一位二進制數位求反得到反碼,反碼符號位不變,反碼數值位最低位加1,得到補碼。
- **移碼和補碼尾數相同,符號位相反**
### 二、定點數的運算(重點)
[計算機組成原理 定點運算-移位、加、減、乘、除](https://blog.csdn.net/gl620321/article/details/106534016?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242)
#### 1、定點數的移位運算
計算機中的移位是數據相對於小數點移位(左移或右移),數據移動,**小數點位置不發生變化**
##### 有符號數的移位
左移1位:機器數對應真值的絕對值變為原來2倍
右移1位:機器數對應真值的絕對值變為原來1/2倍
移位過程中,填補空位:
- 負數數值部分和真值相同![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2021061510432870.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
##### 無符號數的移位
- 邏輯左移 低位添0,高位移丟
- 邏輯右移 高位添0,低位移丟
eg:
01010011
邏輯左移 所有位都參加移位操作 高位0移丟,最低位添0 :10100110
算術左移 第一个0表示符號位,這個數為正數,符號位不參與移位,移位的是後面的數據00100110
eg:
10110010
邏輯右移 所有位都參加移位操作 空出的最高位補0,最低位丟弃01011001
算術右移 最高位不參與移位,符號位,表示負數,右移左側空出最高位添1,右側0丟弃11011001
#### 2、補碼加減法
##### 補碼加法
公式:$$ [x+y]_補=[x]_補+[y]_補 (mod 2^{n+1}) \\
|x|<(2n-1) , |y|<(2n-1) , |x+y|<(2n-1) $$ 公式表明:在2^n+1^模意義下,**任意兩數的補碼之和等於該兩數之和的補碼**。
证明:
(1)x > 0,y > 0,則x+y > 0,因正數的原碼補碼都一樣,所以[x]~補~+[y]~補~ = x+y = [x+y]~補~
(2)x > 0,y < 0,則x+y > 0或x+y < 0
**[x]~補~= x,[y]~補~ = 2^n+1^+y**
[x]~補~+[y]~補~ = (x+y)+2^n+1^ = [x+y]~補~ (mod 2^n+1^)
(3)x < 0,y > 0,則x+y > 0或x+y < 0
**[x]~補~= 2^n+1^+x,[y]~補~ = y**
[x]~補~+[y]~補~ = (x+y)+2^n+1^ = [x+y]~補~ (mod 2^n+1^)
(4)x < 0,y < 0,則x+y < 0
**[x]~補~= 2^n+1^+x,[y]~補~ = 2^n+1^+y**
[x]~補~+[y]~補~ = 2^n+1^+x + 2^n+1^+y
= 2^n+1^+( 2^n+1^+x+y)
= [x+y]~補~ (mod 2^n+1^)
eg: x=+1011 , y=-0101 , 求 x+y=?
解:[x]~補~ = **0**1011, [y]~補~ = **1**1011
[x]補 **0** 1 0 1 1
+ [y]補 **1** 1 0 1 1
————————————————
[x+y]補 **~~1~~ 0** 0 1 1 0
∴ x+y = +0110
1、符號位作為數的一部分參加運算。
2、在2n+1模意義下相加,即超過2n+1的進位要丟掉
##### 補碼減法
為了將減法轉變為加法,需證明公式:
$$ [x-y]_補=[x]_補-[y]_補 = [x]_補+[-y]_補 (mod 2^{n+1}) $$
[x-y]補= [x ]補- [ y]補=[x]補+[-y]補
(證明) 為了求得同時[-y]補, 需要證明[-y]~補~=乛[y]~補~+2^-n^(意義是[-y]~補~等於[y]~補~包括符號位取反,末位加1)
∵ [x]~補~+[y]~補~ = [x+y]~補~
∴ [y]~補~ = [x+y]~補~ - [x]~補~
又∵ [x-y]~補~ = [x+(-y)]~補~ = [x]~補~+[-y]~補~
∴ [-y]~補~ = [x-y]~補~ - [x]~補~
故[y]~補~ + [-y]~補~
= [x+y]~補~ - [x]~補~ + [x-y]~補~ - [x]~補~
= [x+y+x-y]~補~-[x+x]~補~
= [x+x]~補~ - [x+x]~補~
= 0
故[-y]~補~ = -[y]~補~(mod 2^n+1^)
**由[X]~補~求[-X]~補~:連符號位一起各位求反,末位加1**
#### 3、定點數的乘除運算
##### 乘法運算
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615165911334.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615173341744.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615173417764.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
##### 除法運算
**恢復餘數法**:將被除數-除數,
結果大於0,商1,餘數左移一位。
結果小於0,商0,恢復餘數,餘數左移一位。
重複上述操作,直至商的精度滿足要求為止。
不恢復餘數法( **加減交替法**)
- **第一次**: 若**被除數與除數同號**,做**被除數減除**;若**被除數與除數異號**,做**被除數加除數**
- 若**餘數與除數同號**,**商1,餘數左移**一位,**減除數**;若**餘數與除數異號**,**商0,餘數左移**一位,**加除數**
- 商的末位恒置1(誤差 2-n),餘數可以是負的,不需要恢復餘數。
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615172953483.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
eg:p44
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2021061517345746.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
#### 4、溢出概念和判別方法
##### 溢出的概念
在定點整數機器中,數的表示範圍 **|x| < (2^n^-1)** ,在運算過程中如果出現大於字長絕對值的現象,稱為“溢出”。
[例15] x=+1011 , y=+1001 , 求 x+y 。
解:[x]~補~=01011 , [y]補=01001
[x]補 **0** 1 0 1 1
+ [x]補 **0** 1 0 0 1
——————————————
[x+y]補 **1** 0 1 0 0
兩個正數相加的結果成為負數,稱為**上溢**(結果大於機器所能表示的最大正數
[例16] x=-1101 , y=-1011 , 求 x+y 。
解:[x]補=10011 , [y]補=10101
[x]補 **1** 0 0 1 1
+ [x]補 **1** 0 1 0 1
——————————————
[x+y]補 **0** 1 0 0 0
兩個負數相加的結果成為正數,稱為**下溢**(結果小於機器所能表示的最小負數)
##### 溢出的檢測
###### 雙符號位法(變形補碼)
參與加減運算的數采用**變形補碼**表示
[x]~補~=2^n+2^+x (mod 2^n+2^)
[x+y]~補~=[x]~補~+[y]~補~ (mod 2^n+2^)
- 兩個符號位都參與運算
- 在2^n+2^模意義下相加,即最高符號位產生的進位要丟掉
Sf1 SF2
0 0 正確(正數)
0 1 上溢
1 0 下溢
1 1 正確(負數)
**兩符號位相異**時,表示**溢出**;**相同**時,**沒有溢出**。 無論是否溢出,**Sf1(即最高位) 表示結果正確的符號**
#### 練習題
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210622103102351.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
## 2.3 浮點數的表示和運算
### 一、浮點數的表示
浮點數的表示範圍
### 二、IEEE754標準。
### 三、浮點數的加減運算
1. 0操作數的**檢查**,看有無簡化操作的可能;
2. **比較階碼**大小並完成**對階**(小階向大階對齊);
3. **尾數**進行**加或減**運算;
4. 結果**規範化**並進行**舍入**處理。
#### 對階
實現使兩數階碼相同的過程
**對階原則**:階碼小的數向階碼大的數對齊
**對階過程**:首先應求出兩數階碼E~x~和E~y~之差,看是否相等。若不等,要通過尾數的移動以改變E~x~和E~y~,即對階,使之相等。即小階的尾數向右移動(相當於小數點左移),每右移一位,其階碼加1,直到兩數的階碼相等為止,右移的位數等於階差。
#### 尾數求和
方法和定點加減運算完全一樣
#### 規範化
浮點數的規範化要求**尾數域的最高有效位應為1**,將運算結果**右移**以實現規範化稱為**右規**,將運算結果**左移**以實現規範化稱為**左規**
**規範化數的判斷方法**(單符號法)
- 原碼:不論正數還是負數,第一數位為1
- 反碼、補碼:符號位和第一數位不同![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615174740285.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
#### 舍入處理
舍入處理的目的:在對階或向右規範化時,尾數要向右移位,被右移的低位部分會被丟掉,造成一定誤差。為了減小誤差。
IEEE754標準的舍入處理
- 就近舍入(0舍1入):類似”四舍五入”,丟弃的最高位為1,進1
- 朝0舍入:簡單的截尾
- 朝+∞舍入:正數多餘位不全為”0”,進1;負數,截尾
- 朝-∞ 舍入:負數多餘位不全為”0”,進1;正數,截尾
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615175154740.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615175250182.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615175326164.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615175355975.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
## 2.4 算術邏輯單元ALU
### 一、串行加法器和並行加法器
一位全加器的邏輯表達式如下:
F~i~ = A~i~ ⊕ B~i~ ⊕ C~n+i~
C~n+i+1~ = A~i~B~i~ + A~i~C~n+i~ + B~i~C~n+i~
**C為進位**
**串行加法器**
- 只有一個全加器,數據逐位串行送入加法器中進行運算。進位觸發器用來寄存進位信號,以便參與下一次運算。
- 如果操作數長n位,加法就要分n次進行,每次產生一位和,並且串行逐位地送回寄存器。
**並行加法器**
- 並行加法器由多個全加器組成,其位數與機器的字長相同,各位數據同時運算。
- 並行加法器的最長運算時間主要是由進位信號的傳遞時間決定的
- 並行加法器的每個全加器都有一個從低位送來的進位輸入和一個傳送給高位的進位輸出
- 並行加法器的進位通常分為串行進位與並行進位。
### 二、算術邏輯單元ALU的功能和結構
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615180544688.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)
ALU的邏輯圖如上
F~i~ = X~i~ ⊕ Y~i~ ⊕ C~n+1~
C~n+i+1~ = X~i~Y~i~ + Y~i~C~n+1~ + X~i~C~n+1~
不同的控制參數可以得到不同的組合函數,從而能夠實現多種算術運算和邏輯運算。
Xi和Yi 與控制參數和輸入量的關係構造如下真值表
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210615181609181.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODkwNTMz,size_16,color_FFFFFF,t_70)