2.1 數制與編碼
2.1.1 進位計數制及其相互轉化
r進制數:每個數碼可能出現r種字符,逢r進1,每個數碼位所用到的不同符號的個數稱為基數,r 進制的基數為r
一個r進制數()可表示為
八進制—> 二進制:每位八進制對應的3位二進制
十六進制—> 二進制:每位十六進制對應的4位二進制
二進制 —> 十六進制:4位一組,毎組轉換成對應的十六進制符號
二進制 —> 八進制:3位一組,毎組轉換成對應的八進制符號
十進制—> 任意進制:整數除基取余法,小數乘基取整法
Eg:75.3,75D = 1001011B,0.3D = 0.01001… B,過程如下圖所示

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

- 漢字表示: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位、糾錯能力1位

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
信息碼左移R位,低位補0(101001000)對1101做除法運算,得到110101余數001(校驗位)
因此CRC=101001 001
其檢錯能力:
- 可檢測出所有奇數個錯誤;
- 可檢測出所有雙比特的錯誤;
- 可檢測出所有小于等于校驗位長度的連續(xù)錯誤;
2.2 定點數的表示和運算
定點數:小數點的位置固定,如996.007
浮點數:小數點的位置不固定,如9.96007*10^2
2.2.1 無符號數的概念
無符號數:整個機器字長的全部二進制位均為數值位,沒有符號位,相當于數的絕對值。
n位無符號數的表示范圍為
2.2.2 有符號數的定點表示
可用原碼、反碼、補碼三種方式來表示定點整數和定點小數。還可用移碼表示定點整數。
2.2.2.1 原碼
原碼:用尾數表示真值的絕對值,符號位“0/1”對應“正/負”
若機器字長為n+1位,則尾數占n位
源碼整數范圍
源碼小數范圍
2.2.2.2 反碼
若符號位為0,則反碼與原碼相同
若符號位為1,則數值位全部取反
若機器字長n+1位,反碼整數的表示范圍
真值0有+0 和-0 兩種形式
反碼小數的表示范圍:
真值0有+0 和-0 兩種形式
2.2.2.3 補碼
正數的補碼=原碼
負數的補碼=反碼末位+1(要考慮進位)
定點整數補碼[x]補= 1,0000000表示
定點小數補碼[x]補= 1.0000000表示x = -1
[+0]補= [-0]補= 00000000,即0只有1種表示形式
補碼整數的表示范圍
補碼小數的表示范圍
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的左邊同反碼
- 算數移位左移相當于×2;右移相當于÷2,規(guī)則如上
- 邏輯移位:左移和右移都是補0
- 循環(huán)移位:若不帶進位位(CF),則用移出的位補上空缺,若有進位位,則最高位存放到進位位里
2.2.3.2 原碼的加減運算
原碼的加法運算:
- 正+正:絕對值做加法,結果為正
- 負+負:絕對值做加法,結果為負
- 正+負:絕對值大的減絕對值小的,符號同絕對值大的數
- 負+正:絕對值大的減絕對值小的,符號同絕對值大的數
原碼的減法運算,“減數”符號取反,轉變?yōu)榧臃ǎ?/p>
2.2.3.3 補碼的加減運算

轉化小技巧
①數值位取反+1;
②負數補碼中,最右邊的1及其右邊同原碼。最右邊的1的左邊同反碼
2.2.3.4 溢出判斷
溢出時指運算結果超過了數所能表示的范圍
只有“正數+正數”才會上溢——正+正=負
只有“負數+負數”才會下溢——負+負=正
- 采用一位符號位
設A的符號為,B的符號為
,運算結果的符號為
,則溢出邏輯表達式為
若V=0,表示無溢出;若V=1,表示有溢出。
- 采用一位符號位,根據數據位進位情況判斷溢出
設符號位的進位 最高數值位的進位
若V=0,表示無溢出;V=1,表示有溢出。
- 采用雙符號位
正數符號為00,負數符號為11,記兩個符號位為,
表示為正數,無溢出
表示正溢出
表示為負數,無溢出
表示為負溢出
2.2.3.5 符號擴展
定點整數的符號擴展:在原符號位和數值位中間添加新位,正數都添0;負數原碼添0,負數反、補碼添1
定點小數的符號擴展:在原符號位和數值位后面添加新位,正數都添0;負數原、補碼添0,負數反碼添1
2.2.3.6 原碼的乘法運算
對兩個原碼
- 符號位單獨處理,符號位結果為
- 數值位取絕對值進行乘法計算,實現方法:先加法再移位,重復n次
當前位=1,則ACC加上被乘數
當前位=0,則ACC加上0

2.2.3.7 補碼乘法運算
n輪加法、算數右移,加法規(guī)則如下:
- 輔助位- MQ中最低位= 1時,(ACC)+[x]補
- 輔助位- MQ中最低位= 0時,(ACC)+0
- 輔助位- MQ中最低位= -1時,(ACC)+[-x]補

2.2.3.8 原碼除法運算
- 恢復余數法,實現方法:上商0/1,得到余數,余數末尾補0

- 加減交替法:當余數為負時商0,并左移,再+|除數|

2.2.3.9 補碼除法運算
余數和除數同號,商1,余數左移一位減去除數;余數和除數異號,商0,余數左移一位加上除數。重復n次
被除數和除數同號,則被除數減去除數;異號則被除數加上除數。

2.2.4 C語言種的整數類型和類型轉化
C語言中的定點整數是用補碼來存儲的
- 無符號數與有符號數的類型轉化
int main(){
short x = -4321;
unsigned short y = (unsigned short)x;
printf("x=%d,y=%d",x,y); //output:x=-4321,y=61215
}
可以看出來,轉化不改變數據內容,改變解釋方式
- 不同類型長整數轉化
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 數據的存儲和排列

2.3 浮點數的表示和運算
2.3.1 浮點數的表示
2.3.1.1 浮點數的表示格式
浮點數的真值一般表示為
其中,r是浮點數階碼的底,與尾數基數相同,E稱為階碼,M稱為尾數
階碼E反映浮點數的表示范圍及小數點的實際位置;
尾數M的數值部分的位數n反映浮點數的精度。尾數給出一個小數,階碼指明了小數點要向前/向后移動幾位。

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

階碼真值=移碼-偏移量

2.3.2 浮點數的加減運算

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

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