計算機組成原理(二)數據的表示和運算

2.1 數制與編碼

2.1.1 進位計數制及其相互轉化

r進制數:每個數碼可能出現r種字符,逢r進1,每個數碼位所用到的不同符號的個數稱為基數,r 進制的基數為r

一個r進制數(K_{n}K_{n-1}\cdots K_2K_1K_0K_{-1}K_{-2}\cdots)可表示為
K_nr^n+K_{n-1}r^{n-1}+\cdots+K_0r^0+K_{-1}r^{-1}+\cdots=\sum_{i=n}^{-m}{K_ir^i}
八進制—> 二進制:每位八進制對應的3位二進制

十六進制—> 二進制:每位十六進制對應的4位二進制

二進制 —> 十六進制:4位一組,毎組轉換成對應的十六進制符號

二進制 —> 八進制:3位一組,毎組轉換成對應的八進制符號

十進制—> 任意進制:整數除基取余法,小數乘基取整法

Eg:75.3,75D = 1001011B,0.3D = 0.01001… B,過程如下圖所示

進制轉化.png

2.1.2 真值和機器數

真值:符合人類習慣的數字,即實際的帶符號的數值
機器數:數字實際存到機器里的形式,正負號需要被“數字化”

BCD碼大綱已經刪除,這里不寫出

2.1.3 字符與字符串

  • ASCII碼
ASCII碼.png
  • 漢字表示:GB 2312-80 :漢字+各種符號共7445個

2.1.4 校驗碼

2.1.4.1 奇偶校驗碼

由若干位代碼組成的一個字叫碼字。將兩個碼字逐位進行對比,具有不同的位的個數稱為兩個碼字間的距離。一種編碼方案可能有若干個合法碼字,各合法碼字間的最小距離稱為“碼距”。

當d=1時,無檢錯能力;當d=2時,有檢錯能力;當d≥3時,若設計合理,可能具有檢錯、糾錯能力

奇偶校驗碼即由若干位有效信息再加上一個二進制位(校驗位)組成校驗碼,校驗碼的取值(0或1),整個校驗碼(有效信息位和校驗位)中“1”的個數,為奇數時稱為奇校驗碼,為偶數時稱為偶校驗碼

偶校驗的硬件實現:各信息進行異或(模2加)運算,得到的結果即為偶校驗位

2.1.4.2 海明校驗碼

將n個信息位分為k份,分別對其進行奇偶校驗,校驗位數目
2^k\ge n+k+1
求解步驟

  1. 由公式確定海明碼的位數
  2. 確定校驗位的分布:校驗位P_i放在海明位號為2^{i-1}的位置上信息位按順序放到其余位置
  3. 求校驗位的值
  4. 糾錯

海明碼的檢錯能力2位、糾錯能力1位

海明碼求解.png

2.1.4.3 循環(huán)冗余校驗碼(CRC)

思想:數據發(fā)送、接受方約定一個“除數”;K個信息位+R個校驗位作為“被除數”,添加校驗位后需保證除法的余數為0;收到數據后,進行除法檢查余數是否為0

例:設生成多項式為G(x)=x3+x2+1,信息碼為101001

K為信息碼的位數=6,R=最高次冪=3,N=K+R=9

G=1*x^3+1*x^2*0*x^1+1*x^0=1101

信息碼左移R位,低位補0(101001000)對1101做除法運算,得到110101余數001(校驗位)

因此CRC=101001 001

其檢錯能力:

  • 可檢測出所有奇數個錯誤;
  • 可檢測出所有雙比特的錯誤;
  • 可檢測出所有小于等于校驗位長度的連續(xù)錯誤;

2.2 定點數的表示和運算

定點數:小數點的位置固定,如996.007
浮點數:小數點的位置不固定,如9.96007*10^2

2.2.1 無符號數的概念

無符號數:整個機器字長的全部二進制位均為數值位,沒有符號位,相當于數的絕對值。

n位無符號數的表示范圍為(0,2^n-1)

2.2.2 有符號數的定點表示

可用原碼、反碼、補碼三種方式來表示定點整數和定點小數。還可用移碼表示定點整數。

2.2.2.1 原碼

原碼:用尾數表示真值的絕對值,符號位“0/1”對應“正/負”

若機器字長為n+1位,則尾數占n位

源碼整數范圍-(2^n-1)\le x\le2^n-1

源碼小數范圍-(1-2^{-n})\le 1-2^{-n}

2.2.2.2 反碼

若符號位為0,則反碼與原碼相同
若符號位為1,則數值位全部取反

若機器字長n+1位,反碼整數的表示范圍-(2^n-1)\le x\le2^n-1

真值0有+0 和-0 兩種形式

反碼小數的表示范圍:-(1-2^{-n})\le 1-2^{-n}

真值0有+0 和-0 兩種形式

2.2.2.3 補碼

正數的補碼=原碼
負數的補碼=反碼末位+1(要考慮進位)

定點整數補碼[x]補= 1,0000000表示-2^7

定點小數補碼[x]補= 1.0000000表示x = -1

[+0]補= [-0]補= 00000000,即0只有1種表示形式

補碼整數的表示范圍-2^n\le x\le2^n-1

補碼小數的表示范圍-1\le 1-2^{-n}

2.2.2.4 移碼

移碼: 補碼的基礎上將符號位取反

移碼只能用于表示整數,移碼整數的表示范圍與補碼相同

2.2.3 定點數的運算

2.2.3.1 移位運算

移位運算:通過改變各個數碼位和小數點的相對位置,從而改變各數碼位的位權,可用移位運算實現乘法、除法

原碼的算數移位——符號位保持不變,僅對數值位進行移位。

  • 右移:高位補0,低位舍棄。若舍棄的位=0,則相當于÷2;若舍棄的位≠0,則會丟失精度
  • 左移:低位補0,高位舍棄。若舍棄的位=0,則相當于×2;若舍棄的位≠0,則會出現嚴重誤差

反碼的算數移位——正數的反碼與原碼相同,負數的反碼數值位與原碼相反,負數反碼的移位運算規(guī)則如下

  • 右移:高位補1,低位舍棄。
  • 左移:低位補1,高位舍棄。

補碼的算數移位——正數的補碼與原碼相同,負數補碼=反碼末位+1導致反碼最右邊幾個連續(xù)的1都因進位而變?yōu)?,直到進位碰到第一個0為止。負數補碼的算數移位規(guī)則如下:

  • 右移(同反碼):高位補1,低低位舍棄。
  • 左移(同原碼):低位補0,高位舍棄。

規(guī)律——負數補碼中,最右邊的1及其右邊同原碼。最右邊的1的左邊同反碼

  1. 算數移位左移相當于×2;右移相當于÷2,規(guī)則如上
  2. 邏輯移位:左移和右移都是補0
  3. 循環(huán)移位:若不帶進位位(CF),則用移出的位補上空缺,若有進位位,則最高位存放到進位位里

2.2.3.2 原碼的加減運算

原碼的加法運算:

  • 正+正:絕對值做加法,結果為正
  • 負+負:絕對值做加法,結果為負
  • 正+負:絕對值大的減絕對值小的,符號同絕對值大的數
  • 負+正:絕對值大的減絕對值小的,符號同絕對值大的數

原碼的減法運算,“減數”符號取反,轉變?yōu)榧臃ǎ?/p>

2.2.3.3 補碼的加減運算

補碼的加減運算.png

轉化小技巧

①數值位取反+1;
②負數補碼中,最右邊的1及其右邊同原碼。最右邊的1的左邊同反碼

2.2.3.4 溢出判斷

溢出時指運算結果超過了數所能表示的范圍

只有“正數+正數”才會上溢——正+正=負
只有“負數+負數”才會下溢——負+負=正

  • 采用一位符號位

設A的符號為A_S,B的符號為B_S,運算結果的符號為S_S,則溢出邏輯表達式為
V = A _ SB_S\overline{S_S}+\overline{A_S}\overline{B_S}S_S
若V=0,表示無溢出;若V=1,表示有溢出。

  • 采用一位符號位,根據數據位進位情況判斷溢出

設符號位的進位C_S 最高數值位的進位C_1
V=C_S\oplus C_1
若V=0,表示無溢出;V=1,表示有溢出。

  • 采用雙符號位

正數符號為00,負數符號為11,記兩個符號位為S_{S1}S_{S2},
V=S_{S_1}\oplus{S_{S2}}

S_{S1}S_{S2}=00表示為正數,無溢出

S_{S1}S_{S2}=01表示正溢出

S_{S1}S_{S2}=11表示為負數,無溢出

S_{S1}S_{S2}=10表示為負溢出

2.2.3.5 符號擴展

  • 定點整數的符號擴展:在原符號位和數值位中間添加新位,正數都添0;負數原碼添0,負數反、補碼添1

  • 定點小數的符號擴展:在原符號位和數值位后面添加新位,正數都添0;負數原、補碼添0,負數反碼添1

2.2.3.6 原碼的乘法運算

對兩個原碼
[x]_原=x_sx_1x_2\cdots x_n,[y]_原=y_1y_2\cdots y_n

  1. 符號位單獨處理,符號位結果為x_s\oplus y_s
  2. 數值位取絕對值進行乘法計算,實現方法:先加法再移位,重復n次

當前位=1,則ACC加上被乘數
當前位=0,則ACC加上0

原碼一位乘法.png

2.2.3.7 補碼乘法運算

n輪加法、算數右移,加法規(guī)則如下:

  • 輔助位- MQ中最低位= 1時,(ACC)+[x]補
  • 輔助位- MQ中最低位= 0時,(ACC)+0
  • 輔助位- MQ中最低位= -1時,(ACC)+[-x]補
補碼一位乘法.png

2.2.3.8 原碼除法運算

  1. 恢復余數法,實現方法:上商0/1,得到余數,余數末尾補0
恢復余數法.png
  1. 加減交替法:當余數為負時商0,并左移,再+|除數|
加減交替法.png

2.2.3.9 補碼除法運算

余數和除數同號,商1,余數左移一位減去除數;余數和除數異號,商0,余數左移一位加上除數。重復n次

被除數和除數同號,則被除數減去除數;異號則被除數加上除數。

補碼除法.png

2.2.4 C語言種的整數類型和類型轉化

C語言中的定點整數是用補碼來存儲的

  1. 無符號數與有符號數的類型轉化
int main(){
    short x = -4321;
    unsigned short y = (unsigned short)x;
    printf("x=%d,y=%d",x,y);  //output:x=-4321,y=61215
}

可以看出來,轉化不改變數據內容,改變解釋方式

  1. 不同類型長整數轉化
int main(){
    int x = 165537, u = -34991;
    short y = (short)x, v=(short)u;
    printf("x=%d,y=%d\n",x,y); //output:x=165537,y=-31071
    printf("u=%d,v=%d\n",u,v); //output:u=-34991,v=30545
}

長整數變短整數:高位截斷,低位保留

短整數變長整數:符號擴展

2.2.5 數據的存儲和排列

數據的存儲和排列.png

2.3 浮點數的表示和運算

2.3.1 浮點數的表示

2.3.1.1 浮點數的表示格式

浮點數的真值一般表示為
N=r^E×M
其中,r是浮點數階碼的底,與尾數基數相同,E稱為階碼,M稱為尾數

階碼E反映浮點數的表示范圍及小數點的實際位置;
尾數M的數值部分的位數n反映浮點數的精度。

尾數給出一個小數,階碼指明了小數點要向前/向后移動幾位。

浮點數.png

2.3.1.2 浮點數的規(guī)格化

規(guī)格化浮點數:規(guī)定尾數的最高數值位必須是一個有效值。

左規(guī):當浮點數運算的結果為非規(guī)格化時要進行規(guī)格化處理,將尾數算數左移一位,階碼減1。

右規(guī):當浮點數運算的結果尾數出現溢出(雙符號位為01或10)時,將尾數算數右移一位,階碼加1。

用原碼表示的尾數進行規(guī)格化:

  • 正數為0.1××…×的形式,其最大值表示為0.11…1;最小值表示為0.10…0。
  • 尾數的表示范圍為1/2≤M≤(1?2^{?n})
  • 負數為1.1××…×的形式,其最大值表示為1.10…0;最小值表示為1.11…1。
  • 尾數的表示范圍為?(1?2^{?n})≤M≤?1/2。

用補碼表示的尾數進行規(guī)格化:

  • 正數為0.1××…×的形式,其最大值表示為0.11…1;最小值表示為0.10…0。
  • 尾數的表示范圍為1/2≤M≤(1?2^{?n})
  • 負數為1.0××…×的形式,其最大值表示為1.01…1;最小值表示為1.00…0。
  • 尾數的表示范圍為?1≤M≤?(1/2+2^{?n})。

2.3.1.3 IEEE 754標準

IEEE 754標準.png

階碼真值=移碼-偏移量

圖片.png

2.3.2 浮點數的加減運算

浮點數的加減運算.png

2.4 算術邏輯單元(ALU)

2.4.1 串行加法器和并行加法器

  1. 一位全加器

全加器(FA)是最基本的加法單元,有加數(A_i),加數(B_i)與低位傳來的進位(C_{i-1})三個輸入,有本位和向高位的進位共兩個輸出

一位全加器.png

輸入公式為
S_i=A_i\oplus B_i \oplus C_{i-1},C_i=A_iB_i+(A_i\oplus B_i)C_{i-1}

  1. 串行加法器

只有一個全加器,數據逐位串行送入加法器中進行運算。進位觸發(fā)器用來寄存進位信號,以便參與下一次運算。

  1. 并行加法器

把n個全加器串接起來,就可進行兩個n位數的相加。

并行加法器.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容