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ù)()可表示為
八進(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,過程如下圖所示

2.1.2 真值和機(jī)器數(shù)
真值:符合人類習(xí)慣的數(shù)字,即實(shí)際的帶符號的數(shù)值
機(jī)器數(shù):數(shù)字實(shí)際存到機(jī)器里的形式,正負(fù)號需要被“數(shù)字化”
BCD碼大綱已經(jīng)刪除,這里不寫出
2.1.3 字符與字符串
- ASCII碼

- 漢字表示: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ù)目
求解步驟
- 由公式確定海明碼的位數(shù)
- 確定校驗(yàn)位的分布:校驗(yàn)位
放在海明位號為
的位置上信息位按順序放到其余位置
- 求校驗(yàn)位的值
- 糾錯
海明碼的檢錯能力2位、糾錯能力1位

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
信息碼左移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ù)的表示范圍為
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ù)范圍
源碼小數(shù)范圍
2.2.2.2 反碼
若符號位為0,則反碼與原碼相同
若符號位為1,則數(shù)值位全部取反
若機(jī)器字長n+1位,反碼整數(shù)的表示范圍
真值0有+0 和-0 兩種形式
反碼小數(shù)的表示范圍:
真值0有+0 和-0 兩種形式
2.2.2.3 補(bǔ)碼
正數(shù)的補(bǔ)碼=原碼
負(fù)數(shù)的補(bǔ)碼=反碼末位+1(要考慮進(jìn)位)
定點(diǎn)整數(shù)補(bǔ)碼[x]補(bǔ)= 1,0000000表示
定點(diǎn)小數(shù)補(bǔ)碼[x]補(bǔ)= 1.0000000表示x = -1
[+0]補(bǔ)= [-0]補(bǔ)= 00000000,即0只有1種表示形式
補(bǔ)碼整數(shù)的表示范圍
補(bǔ)碼小數(shù)的表示范圍
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的左邊同反碼
- 算數(shù)移位左移相當(dāng)于×2;右移相當(dāng)于÷2,規(guī)則如上
- 邏輯移位:左移和右移都是補(bǔ)0
- 循環(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)算

轉(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的符號為,B的符號為
,運(yùn)算結(jié)果的符號為
,則溢出邏輯表達(dá)式為
若V=0,表示無溢出;若V=1,表示有溢出。
- 采用一位符號位,根據(jù)數(shù)據(jù)位進(jìn)位情況判斷溢出
設(shè)符號位的進(jìn)位 最高數(shù)值位的進(jìn)位
若V=0,表示無溢出;V=1,表示有溢出。
- 采用雙符號位
正數(shù)符號為00,負(fù)數(shù)符號為11,記兩個(gè)符號位為,
表示為正數(shù),無溢出
表示正溢出
表示為負(fù)數(shù),無溢出
表示為負(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è)原碼
- 符號位單獨(dú)處理,符號位結(jié)果為
- 數(shù)值位取絕對值進(jìn)行乘法計(jì)算,實(shí)現(xiàn)方法:先加法再移位,重復(fù)n次
當(dāng)前位=1,則ACC加上被乘數(shù)
當(dāng)前位=0,則ACC加上0

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ǔ)

2.2.3.8 原碼除法運(yùn)算
- 恢復(fù)余數(shù)法,實(shí)現(xiàn)方法:上商0/1,得到余數(shù),余數(shù)末尾補(bǔ)0

- 加減交替法:當(dāng)余數(shù)為負(fù)時(shí)商0,并左移,再+|除數(shù)|

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ù)。

2.2.4 C語言種的整數(shù)類型和類型轉(zhuǎn)化
C語言中的定點(diǎn)整數(shù)是用補(bǔ)碼來存儲的
- 無符號數(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)容,改變解釋方式
- 不同類型長整數(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ù)的存儲和排列

2.3 浮點(diǎn)數(shù)的表示和運(yùn)算
2.3.1 浮點(diǎn)數(shù)的表示
2.3.1.1 浮點(diǎn)數(shù)的表示格式
浮點(diǎn)數(shù)的真值一般表示為
其中,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)要向前/向后移動幾位。

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ù)的表示范圍為
。
- 負(fù)數(shù)為1.1××…×的形式,其最大值表示為1.10…0;最小值表示為1.11…1。
- 尾數(shù)的表示范圍為
。
用補(bǔ)碼表示的尾數(shù)進(jìn)行規(guī)格化:
- 正數(shù)為0.1××…×的形式,其最大值表示為0.11…1;最小值表示為0.10…0。
- 尾數(shù)的表示范圍為
。
- 負(fù)數(shù)為1.0××…×的形式,其最大值表示為1.01…1;最小值表示為1.00…0。
- 尾數(shù)的表示范圍為
。
2.3.1.3 IEEE 754標(biāo)準(zhǔn)

階碼真值=移碼-偏移量

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

2.4 算術(shù)邏輯單元(ALU)
2.4.1 串行加法器和并行加法器
- 一位全加器
全加器(FA)是最基本的加法單元,有加數(shù)(),加數(shù)(
)與低位傳來的進(jìn)位(
)三個(gè)輸入,有本位和向高位的進(jìn)位共兩個(gè)輸出

輸入公式為
- 串行加法器
只有一個(gè)全加器,數(shù)據(jù)逐位串行送入加法器中進(jìn)行運(yùn)算。進(jìn)位觸發(fā)器用來寄存進(jìn)位信號,以便參與下一次運(yùn)算。
- 并行加法器
把n個(gè)全加器串接起來,就可進(jìn)行兩個(gè)n位數(shù)的相加。
