計(jì)算機(jī)組成原理(二)數(shù)據(jù)的表示和運(yùn)算

2.1 數(shù)制與編碼

2.1.1 進(jìn)位計(jì)數(shù)制及其相互轉(zhuǎn)化

r進(jìn)制數(shù):每個(gè)數(shù)碼可能出現(xiàn)r種字符,逢r進(jìn)1,每個(gè)數(shù)碼位所用到的不同符號的個(gè)數(shù)稱為基數(shù),r 進(jìn)制的基數(shù)為r

一個(gè)r進(jìn)制數(shù)(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}
八進(jìn)制—> 二進(jìn)制:每位八進(jìn)制對應(yīng)的3位二進(jìn)制

十六進(jìn)制—> 二進(jìn)制:每位十六進(jìn)制對應(yīng)的4位二進(jìn)制

二進(jìn)制 —> 十六進(jìn)制:4位一組,毎組轉(zhuǎn)換成對應(yīng)的十六進(jìn)制符號

二進(jìn)制 —> 八進(jìn)制:3位一組,毎組轉(zhuǎn)換成對應(yīng)的八進(jìn)制符號

十進(jìn)制—> 任意進(jìn)制:整數(shù)除基取余法,小數(shù)乘基取整法

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

進(jìn)制轉(zhuǎn)化.png

2.1.2 真值和機(jī)器數(shù)

真值:符合人類習(xí)慣的數(shù)字,即實(shí)際的帶符號的數(shù)值
機(jī)器數(shù):數(shù)字實(shí)際存到機(jī)器里的形式,正負(fù)號需要被“數(shù)字化”

BCD碼大綱已經(jīng)刪除,這里不寫出

2.1.3 字符與字符串

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

2.1.4 校驗(yàn)碼

2.1.4.1 奇偶校驗(yàn)碼

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

當(dāng)d=1時(shí),無檢錯能力;當(dāng)d=2時(shí),有檢錯能力;當(dāng)d≥3時(shí),若設(shè)計(jì)合理,可能具有檢錯、糾錯能力

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

偶校驗(yàn)的硬件實(shí)現(xiàn):各信息進(jìn)行異或(模2加)運(yùn)算,得到的結(jié)果即為偶校驗(yàn)位

2.1.4.2 海明校驗(yàn)碼

將n個(gè)信息位分為k份,分別對其進(jìn)行奇偶校驗(yàn),校驗(yàn)位數(shù)目
2^k\ge n+k+1
求解步驟

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

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

海明碼求解.png

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

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

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

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

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

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

因此CRC=101001 001

其檢錯能力:

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

2.2 定點(diǎn)數(shù)的表示和運(yùn)算

定點(diǎn)數(shù):小數(shù)點(diǎn)的位置固定,如996.007
浮點(diǎn)數(shù):小數(shù)點(diǎn)的位置不固定,如9.96007*10^2

2.2.1 無符號數(shù)的概念

無符號數(shù):整個(gè)機(jī)器字長的全部二進(jìn)制位均為數(shù)值位,沒有符號位,相當(dāng)于數(shù)的絕對值。

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

2.2.2 有符號數(shù)的定點(diǎn)表示

可用原碼、反碼、補(bǔ)碼三種方式來表示定點(diǎn)整數(shù)和定點(diǎn)小數(shù)。還可用移碼表示定點(diǎn)整數(shù)。

2.2.2.1 原碼

原碼:用尾數(shù)表示真值的絕對值,符號位“0/1”對應(yīng)“正/負(fù)”

若機(jī)器字長為n+1位,則尾數(shù)占n位

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

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

2.2.2.2 反碼

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

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

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

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

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

2.2.2.3 補(bǔ)碼

正數(shù)的補(bǔ)碼=原碼
負(fù)數(shù)的補(bǔ)碼=反碼末位+1(要考慮進(jìn)位)

定點(diǎn)整數(shù)補(bǔ)碼[x]補(bǔ)= 1,0000000表示-2^7

定點(diǎn)小數(shù)補(bǔ)碼[x]補(bǔ)= 1.0000000表示x = -1

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

補(bǔ)碼整數(shù)的表示范圍-2^n\le x\le2^n-1

補(bǔ)碼小數(shù)的表示范圍-1\le 1-2^{-n}

2.2.2.4 移碼

移碼: 補(bǔ)碼的基礎(chǔ)上將符號位取反

移碼只能用于表示整數(shù),移碼整數(shù)的表示范圍與補(bǔ)碼相同

2.2.3 定點(diǎn)數(shù)的運(yùn)算

2.2.3.1 移位運(yùn)算

移位運(yùn)算:通過改變各個(gè)數(shù)碼位和小數(shù)點(diǎn)的相對位置,從而改變各數(shù)碼位的位權(quán),可用移位運(yùn)算實(shí)現(xiàn)乘法、除法

原碼的算數(shù)移位——符號位保持不變,僅對數(shù)值位進(jìn)行移位。

  • 右移:高位補(bǔ)0,低位舍棄。若舍棄的位=0,則相當(dāng)于÷2;若舍棄的位≠0,則會丟失精度
  • 左移:低位補(bǔ)0,高位舍棄。若舍棄的位=0,則相當(dāng)于×2;若舍棄的位≠0,則會出現(xiàn)嚴(yán)重誤差

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

  • 右移:高位補(bǔ)1,低位舍棄。
  • 左移:低位補(bǔ)1,高位舍棄。

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

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

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

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

2.2.3.2 原碼的加減運(yùn)算

原碼的加法運(yùn)算:

  • 正+正:絕對值做加法,結(jié)果為正
  • 負(fù)+負(fù):絕對值做加法,結(jié)果為負(fù)
  • 正+負(fù):絕對值大的減絕對值小的,符號同絕對值大的數(shù)
  • 負(fù)+正:絕對值大的減絕對值小的,符號同絕對值大的數(shù)

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

2.2.3.3 補(bǔ)碼的加減運(yùn)算

補(bǔ)碼的加減運(yùn)算.png

轉(zhuǎn)化小技巧

①數(shù)值位取反+1;
②負(fù)數(shù)補(bǔ)碼中,最右邊的1及其右邊同原碼。最右邊的1的左邊同反碼

2.2.3.4 溢出判斷

溢出時(shí)指運(yùn)算結(jié)果超過了數(shù)所能表示的范圍

只有“正數(shù)+正數(shù)”才會上溢——正+正=負(fù)
只有“負(fù)數(shù)+負(fù)數(shù)”才會下溢——負(fù)+負(fù)=正

  • 采用一位符號位

設(shè)A的符號為A_S,B的符號為B_S,運(yùn)算結(jié)果的符號為S_S,則溢出邏輯表達(dá)式為
V = A _ SB_S\overline{S_S}+\overline{A_S}\overline{B_S}S_S
若V=0,表示無溢出;若V=1,表示有溢出。

  • 采用一位符號位,根據(jù)數(shù)據(jù)位進(jìn)位情況判斷溢出

設(shè)符號位的進(jìn)位C_S 最高數(shù)值位的進(jìn)位C_1
V=C_S\oplus C_1
若V=0,表示無溢出;V=1,表示有溢出。

  • 采用雙符號位

正數(shù)符號為00,負(fù)數(shù)符號為11,記兩個(gè)符號位為S_{S1}S_{S2},
V=S_{S_1}\oplus{S_{S2}}

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

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

S_{S1}S_{S2}=11表示為負(fù)數(shù),無溢出

S_{S1}S_{S2}=10表示為負(fù)溢出

2.2.3.5 符號擴(kuò)展

  • 定點(diǎn)整數(shù)的符號擴(kuò)展:在原符號位和數(shù)值位中間添加新位,正數(shù)都添0;負(fù)數(shù)原碼添0,負(fù)數(shù)反、補(bǔ)碼添1

  • 定點(diǎn)小數(shù)的符號擴(kuò)展:在原符號位和數(shù)值位后面添加新位,正數(shù)都添0;負(fù)數(shù)原、補(bǔ)碼添0,負(fù)數(shù)反碼添1

2.2.3.6 原碼的乘法運(yùn)算

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

  1. 符號位單獨(dú)處理,符號位結(jié)果為x_s\oplus y_s
  2. 數(shù)值位取絕對值進(jìn)行乘法計(jì)算,實(shí)現(xiàn)方法:先加法再移位,重復(fù)n次

當(dāng)前位=1,則ACC加上被乘數(shù)
當(dāng)前位=0,則ACC加上0

原碼一位乘法.png

2.2.3.7 補(bǔ)碼乘法運(yùn)算

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

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

2.2.3.8 原碼除法運(yùn)算

  1. 恢復(fù)余數(shù)法,實(shí)現(xiàn)方法:上商0/1,得到余數(shù),余數(shù)末尾補(bǔ)0
恢復(fù)余數(shù)法.png
  1. 加減交替法:當(dāng)余數(shù)為負(fù)時(shí)商0,并左移,再+|除數(shù)|
加減交替法.png

2.2.3.9 補(bǔ)碼除法運(yùn)算

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

被除數(shù)和除數(shù)同號,則被除數(shù)減去除數(shù);異號則被除數(shù)加上除數(shù)。

補(bǔ)碼除法.png

2.2.4 C語言種的整數(shù)類型和類型轉(zhuǎn)化

C語言中的定點(diǎn)整數(shù)是用補(bǔ)碼來存儲的

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

可以看出來,轉(zhuǎn)化不改變數(shù)據(jù)內(nèi)容,改變解釋方式

  1. 不同類型長整數(shù)轉(zhuǎn)化
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
}

長整數(shù)變短整數(shù):高位截?cái)?,低位保?/p>

短整數(shù)變長整數(shù):符號擴(kuò)展

2.2.5 數(shù)據(jù)的存儲和排列

數(shù)據(jù)的存儲和排列.png

2.3 浮點(diǎn)數(shù)的表示和運(yùn)算

2.3.1 浮點(diǎn)數(shù)的表示

2.3.1.1 浮點(diǎn)數(shù)的表示格式

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

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

尾數(shù)給出一個(gè)小數(shù),階碼指明了小數(shù)點(diǎn)要向前/向后移動幾位。

浮點(diǎn)數(shù).png

2.3.1.2 浮點(diǎn)數(shù)的規(guī)格化

規(guī)格化浮點(diǎn)數(shù):規(guī)定尾數(shù)的最高數(shù)值位必須是一個(gè)有效值。

左規(guī):當(dāng)浮點(diǎn)數(shù)運(yùn)算的結(jié)果為非規(guī)格化時(shí)要進(jìn)行規(guī)格化處理,將尾數(shù)算數(shù)左移一位,階碼減1。

右規(guī):當(dāng)浮點(diǎn)數(shù)運(yùn)算的結(jié)果尾數(shù)出現(xiàn)溢出(雙符號位為01或10)時(shí),將尾數(shù)算數(shù)右移一位,階碼加1。

用原碼表示的尾數(shù)進(jìn)行規(guī)格化:

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

用補(bǔ)碼表示的尾數(shù)進(jìn)行規(guī)格化:

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

2.3.1.3 IEEE 754標(biāo)準(zhǔn)

IEEE 754標(biāo)準(zhǔn).png

階碼真值=移碼-偏移量

圖片.png

2.3.2 浮點(diǎn)數(shù)的加減運(yùn)算

浮點(diǎn)數(shù)的加減運(yùn)算.png

2.4 算術(shù)邏輯單元(ALU)

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

  1. 一位全加器

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

一位全加器.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. 串行加法器

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

  1. 并行加法器

把n個(gè)全加器串接起來,就可進(jìn)行兩個(gè)n位數(shù)的相加。

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容