電腦組成原理 – 計算篇
章節導學
1. 進位運算的基本知識
1.1 進位概述
-
進位的定義
- 有限種數字元號來表示無限的數值
- 進位制是一種記數方式,亦稱進位計數法或位值計數法
- 使用的數字元號的數目稱為這種進位制的基數或底數
-
常見的進位
- 二進位
- 八進位
- 十六進位
- 二十進位
- 六十進位
1.2 二進位運算的基礎
二進位(整數)轉換十進位
二進位(整數)轉換十進位:按權展開法
正整數N,基數為r
𝑁 = 𝑑𝑛−1𝑑𝑛−2 ⋯ 𝑑1𝑑0
= 𝑑𝑛−1r𝑛−1 +𝑑𝑛−2 r𝑛−2 + ⋯ + 𝑑1𝑟 + 𝑑0
例:𝑁 = 01100101 = 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 22 + 1 = 101
例:𝑁 = 11101101 = 1 ∗ 27 + 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 23 + 1 ∗ 22 + 1 = 237
十進位(整數)轉換二進位
十進位(整數)轉換二進位:重複相除法
例:(101)10 = ( )2
重複除以2 | 得商 | 取餘數 | |
---|---|---|---|
101/2 | 50 | 1 | |
50/2 | 25 | 0 | 按 |
25/2 | 12 | 1 | 逆 |
12/2 | 6 | 0 | 序 |
6/2 | 3 | 0 | 排 |
3/2 | 1 | 1 | 列 |
1/2 | 0 | 1 | |
二進位結果 | 01100101 |
𝑁 = (01100101)2 = 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 22+ 1 = (101)10
例:23710 = ( )2
重複除以2 | 得商 | 取餘數 | |
---|---|---|---|
237/2 | 118 | 1 | |
118/2 | 59 | 0 | 按 |
59/2 | 29 | 1 | 逆 |
29/2 | 14 | 1 | 序 |
14/2 | 7 | 0 | 排 |
7/2 | 3 | 1 | 列 |
3/2 | 1 | 1 | |
1/2 | 0 | 1 | |
二進位結果 | 11101101 |
𝑁 = (11101101)2 = 1 ∗ 27 + 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 23 + 1 ∗ 2^2 + 1 = (237)10
二進位(小數)轉換十進位
二進位(小數)轉換十進位:按權展開法
小數N,基數為r,從小數點右邊開始,小數點左邊為正,右邊為負
𝑁 = 𝑑𝑛−1𝑑𝑛−2 ⋯ 𝑑1𝑑0
= 𝑑𝑛−1r𝑛−1 +𝑑𝑛−2 r𝑛−2 + ⋯ + 𝑑1𝑟 + 𝑑0
例:𝑁 = (0.11001) = 1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−5 = 0.78125 = 25/32
例:𝑁 = (0.01011) = 1 ∗ 2−2 + 1 ∗ 2−4 + 1 ∗ 2−5 = 0.34375 = 11/32
十進位(小數)轉換二進位
十進位(小數)轉換二進位:重複相乘法
- 重複乘以2
- 得積
- 取整數部分
- 結果按正序排列
十進位(分數)轉換二進位
十進位(分數)轉換二進位:重複相乘法
- 重複乘以2
- 得積:
把假分數化為真分數
- 取1:
取第一個數值
- 結果按正序排列
例:25/32轉化為二進位
重複乘以2 | 得積 | 取1 | |
---|---|---|---|
25/32 | 50/32= 1+9/16 | 1 | 按 |
9/16 | 18/16= 1+1/8 | 1 | 正 |
1/8 | 1/4= 0+1/4 | 0 | 序 |
1/4 | 1/2= 0+1/2 | 0 | 排 |
1/2 | 1= 1+0 | 1 | 列 |
二進位結果 | 0.11001 |
𝑁 = 0.11001 = 1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−5 = 0.78125=25/32
例:11/32轉化為二進位
重複乘以2 | 得積 | 取1 | |
---|---|---|---|
11/32 | 11/16= 0+11/16 | 0 | 按 |
11/16 | 11/8= 1+3/8 | 1 | 正 |
3/8 | 3/4= 0+3/4 | 0 | 序 |
3/4 | 3/2= 1+1/2 | 1 | 排 |
1/2 | 1/1= 1+0 | 1 | 列 |
二進位結果 | 0.01011 |
𝑁 = 0.01011 = 1 ∗ 2−2 + 1 ∗ 2−4 + 1 ∗ 2−5 = 0.34375 = 11/32
2. 二進位數據的表示方法
2.1 有符號數與無符號數
+表示正數,-表示負數
2.2 二進位的原碼錶示法
原碼錶示法特點
- 規定符號位位於數值第一位
- 使用0表示正數、1表示負數
- 表達簡單明了,是人類最容易理解的表示法
0在原碼中有兩種表示方法:00、10
原碼進行運算非常複雜,特別是兩個操作數符號不同的時候
2.3 二進位的補碼錶示法
補碼的定義
例子1:n=4,x=13,計算x的二進位原碼和補碼
原碼:x=0,1101
補碼:x=0,1101
例子2:x=-13,計算x的二進位原碼和補碼
原碼:x=1,1101
補碼:2𝑛+1 + 𝑥 = 24+1 − 13 = 100000 − 1101 = 1 0011(高亮部分為符號位)
補碼:x=1,0011
例子3:x=-7,計算x的二進位原碼和補碼
原碼:x=1,0111
補碼:2𝑛+1 + 𝑥 = 24+1 − 7 = 100000 − 0111 = 1 1001
補碼:x=1,1001
例子4:x=-1,計算x的二進位原碼和補碼
原碼:x=1,0001
補碼:2𝑛+1~ + 𝑥 = 24+1 − 1 = 100000 − 0001 = 1 1111
補碼:x=1,1111
引進補碼的目的
-
使用加法代替減法操作,從而消除減法
-
減法運算複雜,希望找到使用正數替代負數的方法
但在計算補碼的過程中,還是使用了減法!!
2.4 二進位的反碼錶示法
反碼的定義
例子1:x=-13,計算x的二進位原碼和反碼
原碼:x=1,1101
反碼:(2𝑛+1−1) + 𝑥 = (24+1−1)− 13 = 011111 − 1101 = 1 0010(高亮部分為符號位)
反碼:x=1,0010
例子2:x=-7,計算x的二進位原碼和反碼
原碼:x=1,0111
反碼:(2𝑛+1−1) + 𝑥 = (24+1−1) − 7= 011111 − 0111 = 1 1000
反碼:x=1,1000
從以上兩個例子中可以看出按照定義求反碼依然有減法
引進反碼的目的
消除減法
通過以下規則求反碼可以消除減法的出現
負數的反碼等於原碼除符號位外按位取反
負數的補碼等於反碼+1
例子3:x=-7,計算x的二進位原碼和反碼和補碼
原碼:x=1,0111
反碼:x=1,1000
補碼:x=1,1001
例子4:x=-9,計算x的二進位原碼和反碼和補碼
原碼:x=1,1001
反碼:x=1,0110
補碼:x=1,0111
2.5 小數的二進位補碼錶示
二進位小數的補碼定義
負數的反碼等於原碼除符號位外按位取反
負數的補碼等於反碼+1
例子1:x= 9/16,計算x的二進位原碼和反碼和補碼
原碼:x=0,0.1001 (重複相乘法)
反碼:x= 0,0.1001
補碼:x= 0,0.1001
例子2:x= -11/32,計算x的二進位原碼和反碼和補碼
原碼:x=1,0.01011 (重複相乘法)
反碼:x=1,1.10100
補碼:x=1,1.10101
3. 二進位數據的運算
3.1 定點數與浮點數
3.1.1 定點數的表示方法
定點數:小數點固定在某個位置的數稱之為定點數
3.1.2 浮點數的表示方法
浮點數的表示格式
舉例引入:
123450000000 = 1.2345 × 1011(科學計數法)
1.2345:尾數
10:基數 11:階碼
浮點數的表示格式
S:尾數 , r:基數 , j:階碼
舉例
11.0101 = 0.110101 × 210
11.0101 = 0.0110101 × 211
浮點數的表示範圍
階碼錶示範圍: [−(𝟐𝒎 − 𝟏), 𝟐𝒎 − 𝟏]
尾數表示範圍: [−(𝟏 − 𝟐−𝒏), −(𝟐−𝒏)] [𝟐−𝒏, 𝟏 − 𝟐−𝒏]
浮點數的規格化
- 尾數規定使用純小數
- 尾數最高位必須是1
舉例
123450000000 = 1.2345 × 1011
錯誤寫法:
舉例
11.0101 = 0.110101 × 210
錯誤寫法:
例子1:設浮點數字長為16位,階碼為5位,尾數為11位,將十進位數 13/128表示為二進位浮點數。
- 利用重複相乘法求出原碼
- 原碼=反碼=補碼:𝑥 = 0.0001101000
例子2:設浮點數字長為16位,階碼為5位,尾數為11位,將十進位數−54表示為二進位浮點數。
- 原碼: 𝑥 = 1,110110
3.1.3 定點數與浮點數的對比
- 當定點數與浮點數位數相同時,浮點數表示的範圍更大
- 當浮點數尾數為規格化數時,浮點數的精度更高
- 浮點數運算包含階碼和尾數,浮點數的運算更為複雜
- 浮點數在數的表示範圍、精度、溢出處理、編程等方面均優於定點數
- 浮點數在數的運算規則、運算速度、硬體成本方面不如定點數
3.2 定點數的加減法運算
3.2.1 加法運算
整數加法:A[補] + B[補] = (𝐴 + 𝐵)[補] (𝑚𝑜𝑑2𝑛+1)
小數加法:A[補] + B[補] = (𝐴 + 𝐵)[補] (𝑚𝑜𝑑2)
數值位與符號位一同運算,並將符號位產生的進位自然丟掉
例子1:A=-110010, B=001101,求A+B
A[補] = 1,001110
B[補]= B[原] = 0,001101
A[補] + B [補]= (A + B) [補] =1,011011
A + B = −100101
數值位與符號位一同運算,並將符號位產生的進位自然丟掉
例子2:A=-0.1010010, B=0.0110100,求A+B
A[補] = 1,1.0101110
B[補] = B[原] = 0,0.0110100
A[補] + B[補]= (A + B)[補] =1,1.1100010
A + B =-0.0011110
數值位與符號位一同運算,並將符號位產生的進位自然丟掉
例子3:A=-10010000, B=-01010000,求A+B
A[補] = 1, 01110000
B[補] = 1, 10110000
A[補] + B[補] = (A + B)[補] =1,00100000
A + B =-11100000
驗證:A = −144, B = −80 , A + B = −224
數值位與符號位一同運算,並將符號位產生的進位自然丟掉
例子4:A=-10010000, B=-11010000,求A+B
A[補] = 1, 01110000
B[補] = 1, 00110000
A[補] + B[補] = (A + B) 補 = 0,10100000
A + B = 10100000
驗證:
A = −144, B = −208, A + B = 160
數值位與符號位一同運算,並將符號位產生的進位自然丟掉
3.3.2 判斷溢出
-
雙符號位判斷法
- 單符號位表示變成雙符號位:0=>00, 1=>11
- 雙符號位產生的進位丟棄
- 結果的雙符號位不同則表示溢出
再來看例子4:A=-10010000, B=-11010000,求A+B
A[補] = 1, 01110000
B[補] = 1, 00110000
再來看例子3:A=-10010000, B=-01010000,求A+B
A[補] = 1, 01110000
B[補] = 1, 10110000
(A + B)[原] = 11,11100000 = −11100000
3.2.3 減法運算
整數減法:A[補] − B[補] = 𝐴 + (−𝐵)[補] (𝑚𝑜𝑑2𝑛+1)
小數減法:A[補] − B[補] = 𝐴 + (−𝐵)[補] (𝑚𝑜𝑑2)
-B[補]等於B[補]連同符號位按位取反,末位加一
B[補] = 1,0010101
(−B)[補] = 0,1101011
例子5:A=11001000, B=-00110100,求A-B
A[補] = A[原] = 0,11001000
B[補] = 1,11001100
(−B)[補] = 0,00110100
A[補] − B[補] = A[補] + (−B)[補] = A + (−B)[補]
A + (−B)[補] = 0,11111100
A − B = 111111100 (正數的補碼還是自身)
3.3 浮點數的加減法運算
𝑥 = 𝑆𝑥 × 𝑟𝑗𝑥
𝑦 = 𝑆𝑦 × 𝑟𝑗y
操作流程
3.3.1 對階
- 浮點數尾數運算簡單
- 浮點數位數實際小數位與階碼有關
- 階碼按小階看齊大階的原則
- 対階的目的是使得兩個浮點數階碼一致,使得尾數可以進行運算
舉例
𝑥 = 0.1101 × 201 , 𝑦 = (−0.1010) × 211, 求 x+y
3.3.2 尾數求和
- 使用補碼進行運算
- 對於減法運算要轉化為加法運算:A – B = A + (-B)
3.3.3 尾數規格化(左移)
對補碼進行規格化需要判斷兩種情況:S>0 和 S<0
-
S[補] = 00.1xxxxxx(𝑆 > 0)
-
S[補] = 11.0xxxxxx(𝑆 < 0)
符號位與最高位不一致
如果不滿足此格式,即符號位與最高位一致, 需要進行左移,同時階碼相應變化,以滿足規格化
因此:𝑥 + 𝑦 = −0.1110 × 210
3.3.4 尾數規格化(右移)
- 一般情況下都是左移
- 雙符號位不一致下需要右移 (定點運算的溢出情況)
- 右移的話則需要進行舍入操作
3.3.5 舍入
- 「0舍1入」法(二進位的四捨五入)
例1:
S [補] = 10.10110111
S [補] = 11.01011011(1) 【1次尾數右移,記得階碼要+1哦】
例2:
S [補] = 01.11111111
S [補] = 00.10000000(1)
S [補] = 01.00000000
S [補] = 00.1000000(0)【兩次右規,記得階碼要+2哦】
3.3.6 溢出判斷
- 定點運算雙符號位不一致為溢出
- 浮點運算尾數雙符號位不一致不算溢出【因為尾數雙符號位可以進行右規】
- 浮點運算主要通過階碼的雙符號位判斷是否溢出
- 如果規格化後,階碼雙符號位不一致,則認為是溢出
例子:𝑥 = 0.11010011 × 21101,𝑦 = 0.11101110 × 21100,假設階碼4位,尾數8位,計算x + y
𝑥 + 𝑦[原] = 𝑥 + 𝑦[補] = 0.10100101 × 21110
3.3.7 浮點數的加減法運算總結
尾數右移1位:階碼加1
尾數左移1位:階碼減1
3.4 浮點數的乘除法運算
這部分作為了解
𝑥 = 𝑆𝑥 × 𝑟𝑗𝑥
𝑦 = 𝑆𝑦 × 𝑟𝑗y
乘法:階碼相加,尾數求積
𝑥 × 𝑦 = ( 𝑆𝑥 × 𝑆𝑦 ) × 𝑟(𝑗𝑥+𝑗y)
除法:階碼相減,尾數求商
𝑥/𝑦 = ( 𝑆𝑥 / 𝑆𝑦 ) × 𝑟(𝑗𝑥−𝑗y)
操作流程
例子:𝑥 = 0.11010011 × 21101,𝑦 = 0.11101110 × 20001,假設階碼4位,尾數8位,計算x * y
𝑥 × 𝑦 = ( 𝑆𝑥 × 𝑆𝑦 ) × 𝑟(𝑗𝑥+𝑗y)
= (0.11010011 × 0.11101110) × 𝑟1101+0001
= 0.11000100(保留八位) × 𝑟1110