電腦組成原理 – 計算篇

章節導學

1. 進位運算的基本知識

 

 

1.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

 

十進位(小數)轉換二進位

十進位(小數)轉換二進位:重複相乘法

  1. 重複乘以2
  2. 得積
  3. 取整數部分
  4. 結果按正序排列

 

十進位(分數)轉換二進位

十進位(分數)轉換二進位:重複相乘法

  1. 重複乘以2
  2. 得積:把假分數化為真分數
  3. 取1:取第一個數值
  4. 結果按正序排列

 

例: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 二進位的原碼錶示法

image-20201113105943054

 

原碼錶示法特點

  1. 規定符號位位於數值第一位
  2. 使用0表示正數、1表示負數
  3. 表達簡單明了,是人類最容易理解的表示法

 

0在原碼中有兩種表示方法:00、10

原碼進行運算非常複雜,特別是兩個操作數符號不同的時候

 

 

2.3 二進位的補碼錶示法

補碼的定義

image-20201113101511007

例子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

 

引進補碼的目的

  1. 使用加法代替減法操作,從而消除減法

  2. 減法運算複雜,希望找到使用正數替代負數的方法

    但在計算補碼的過程中,還是使用了減法!!


 

2.4 二進位的反碼錶示法

反碼的定義

03

例子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


image-20201113104912542

 

2.5 小數的二進位補碼錶示

二進位小數的補碼定義

image-20201113105142340

 

負數的反碼等於原碼除符號位外按位取反

負數的補碼等於反碼+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 定點數的表示方法

定點數:小數點固定在某個位置的數稱之為定點數

image-20201118212510531

 

 

3.1.2 浮點數的表示方法

 

浮點數的表示格式

 

舉例引入:

123450000000 = 1.2345 × 1011(科學計數法)

1.2345:尾數

10:基數 11:階碼

 

浮點數的表示格式

S:尾數 , r:基數 , j:階碼

image-20201118213424272

舉例

11.0101 = 0.110101 × 210
11.0101 = 0.0110101 × 211

image-20201118213510860

 

 

 

 

 

浮點數的表示範圍

 

階碼錶示範圍: [−(𝟐𝒎 − 𝟏), 𝟐𝒎 − 𝟏]

尾數表示範圍: [−(𝟏 − 𝟐−𝒏), −(𝟐−𝒏)] [𝟐−𝒏, 𝟏 − 𝟐−𝒏]

image-20201118213906567

 

 

 

 

浮點數的規格化
  1. 尾數規定使用純小數
  2. 尾數最高位必須是1

 

舉例

123450000000 = 1.2345 × 1011

錯誤寫法:

image-20201118214058329

 

舉例

11.0101 = 0.110101 × 210

錯誤寫法:

image-20201118214207080

 

例子1:設浮點數字長為16位,階碼為5位,尾數為11位,將十進位數 13/128表示為二進位浮點數。

  • 利用重複相乘法求出原碼
  • 原碼=反碼=補碼:𝑥 = 0.0001101000

image-20201118214337933

 

例子2:設浮點數字長為16位,階碼為5位,尾數為11位,將十進位數−54表示為二進位浮點數。

  • 原碼: 𝑥 = 1,110110

image-20201118214412515

 

 

3.1.3 定點數與浮點數的對比

  1. 當定點數與浮點數位數相同時,浮點數表示的範圍更大
  2. 當浮點數尾數為規格化數時,浮點數的精度更高
  3. 浮點數運算包含階碼和尾數,浮點數的運算更為複雜
  4. 浮點數在數的表示範圍、精度、溢出處理、編程等方面均優於定點數
  5. 浮點數在數的運算規則、運算速度、硬體成本方面不如定點數

 

 

 

 

 

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

image-20201118220327186

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

image-20201118220445668

A[補] + B[補]= (A + B)[補] =1,1.1100010

A + B =-0.0011110

數值位與符號位一同運算,並將符號位產生的進位自然丟掉

 

例子3:A=-10010000, B=-01010000,求A+B

A[補] = 1, 01110000

B[補] = 1, 10110000

image-20201118220518078

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

image-20201118220843780

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

image-20201118221410615

image-20201118221518102

 

再來看例子3:A=-10010000, B=-01010000,求A+B

A[補] = 1, 01110000

B[補] = 1, 10110000

image-20201118221628551

image-20201118221718907

(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)[補]

image-20201118222127656

A + (−B)[補] = 0,11111100

A − B = 111111100 (正數的補碼還是自身)

 

 

 

3.3 浮點數的加減法運算

 

𝑥 = 𝑆𝑥 × 𝑟𝑗𝑥
𝑦 = 𝑆𝑦 × 𝑟𝑗y

操作流程

image-20201118231637730

 

 

3.3.1 對階

  • 浮點數尾數運算簡單
  • 浮點數位數實際小數位與階碼有關
  • 階碼按小階看齊大階的原則
  • 対階的目的是使得兩個浮點數階碼一致,使得尾數可以進行運算

 

舉例

𝑥 = 0.1101 × 201 , 𝑦 = (−0.1010) × 211, 求 x+y

image-20201118231740745

 

3.3.2 尾數求和

  • 使用補碼進行運算
  • 對於減法運算要轉化為加法運算:A – B = A + (-B)

image-20201118231921718

image-20201118231949399

 

 

3.3.3 尾數規格化(左移)

對補碼進行規格化需要判斷兩種情況:S>0 和 S<0

  1. S[補] = 00.1xxxxxx(𝑆 > 0)

  2. S[補] = 11.0xxxxxx(𝑆 < 0)

    符號位與最高位不一致

如果不滿足此格式,即符號位與最高位一致, 需要進行左移,同時階碼相應變化,以滿足規格化

 

image-20201118232341946

image-20201118232411391

因此:𝑥 + 𝑦 = −0.1110 × 210

 

 

3.3.4 尾數規格化(右移)

  1. 一般情況下都是左移
  2. 雙符號位不一致下需要右移 (定點運算的溢出情況)
  3. 右移的話則需要進行舍入操作

 

3.3.5 舍入

  • 「0舍1入」法(二進位的四捨五入)

 

例1:

S [補] = 10.10110111

S [補] = 11.01011011(1) 【1次尾數右移,記得階碼要+1哦】

image-20201118233056714

例2:

S [補] = 01.11111111

S [補] = 00.10000000(1)

image-20201118234956515

S [補] = 01.00000000

S [補] = 00.1000000(0)【兩次右規,記得階碼要+2哦】

 

3.3.6 溢出判斷

  • 定點運算雙符號位不一致為溢出
  • 浮點運算尾數雙符號位不一致不算溢出【因為尾數雙符號位可以進行右規】
  • 浮點運算主要通過階碼的雙符號位判斷是否溢出
  • 如果規格化後,階碼雙符號位不一致,則認為是溢出

 

例子:𝑥 = 0.11010011 × 21101,𝑦 = 0.11101110 × 21100,假設階碼4位,尾數8位,計算x + y

 

image-20201118233642586

image-20201118233656618

image-20201118233709618

image-20201118233738582

 

𝑥 + 𝑦[原] = 𝑥 + 𝑦[補] = 0.10100101 × 21110

 

 

 

3.3.7 浮點數的加減法運算總結

image-20201118233855044

尾數右移1位:階碼加1

尾數左移1位:階碼減1

 

 

 

 

3.4 浮點數的乘除法運算

這部分作為了解

 

𝑥 = 𝑆𝑥 × 𝑟𝑗𝑥
𝑦 = 𝑆𝑦 × 𝑟𝑗y

乘法:階碼相加,尾數求積

𝑥 × 𝑦 = ( 𝑆𝑥 × 𝑆𝑦 ) × 𝑟(𝑗𝑥+𝑗y)

除法:階碼相減,尾數求商

𝑥/𝑦 = ( 𝑆𝑥 / 𝑆𝑦 ) × 𝑟(𝑗𝑥−𝑗y)

 

操作流程

image-20201118234207111

 

 

例子:𝑥 = 0.11010011 × 21101,𝑦 = 0.11101110 × 20001,假設階碼4位,尾數8位,計算x * y

𝑥 × 𝑦 = ( 𝑆𝑥 × 𝑆𝑦 ) × 𝑟(𝑗𝑥+𝑗y)

= (0.11010011 × 0.11101110) × 𝑟1101+0001

= 0.11000100(保留八位) × 𝑟1110