數制與編碼
常用的 BCD 碼
- 8421碼。它是一種有權碼。
- 余3碼。它是一種無權碼。
- 2421碼。是一種有權碼。特點是 >= 5 的4位二進制數中最高位為1,< 5 的最高位為0。如 5 → 1011 而非 0101。
ASCII 編碼使用8位二進制代碼,最左邊一位是0。
主存字由2B或4B組成,在同一個主存字中,既可以按照先存儲低位字節、后存儲高位字節的順序(即從低位字節向高位字節順序)存放字符串的內容(又稱小端模式),又可按照先存儲高位字節、后存儲低位字節的順序存放字符串的內容(又稱大端模式)。
通常某種編碼都由許多碼字組成,任意兩個合法碼字之間最少變化的二進制位數,稱為校驗碼的碼距。對於碼距不小於 2 的數據校驗碼,開始具有檢錯的能力。碼距越大,檢錯、糾錯的能力就越強,而且檢錯能力總是大於等於糾錯能力。
奇偶檢驗碼:在原編碼上加一個校驗位使整個校驗碼中“1”的個數為奇/偶數。,奇偶檢驗碼只能發現數據中奇數位的出錯情況,但不能糾正錯誤,常用於對存儲器數據的檢查或傳輸數據的檢查。
海明校驗碼:設 n 為有效信息的位數,k 為校驗位的位數,則信息位 n 和校驗位 k 應滿足:n + k <= 2k - 1
設信息位為 D4D3D2D1,共4位,校驗位為 P3P2P1,對應的海明碼為 H7H6H5H4H3H2H1。規定校驗位 Pi 在海明號為 2i-1 的位置上,其余各位為信息位,則海明碼各位的分布如下:
H7 H6 H5 H4 H3 H2 H1
D4 D3 D2 P3 D1 P2 P1
被校驗數據位的海明位號等於校驗該數據位的各校驗位海明位號之和。校驗位 Pi 的值為 由該校驗位校驗的數據位 所有位求異或。
每個校驗組分別利用校驗位和參與形成該校驗位的信息位進行奇偶校驗檢查,
S1 = P1 ⊕ D1 ⊕ D2 ⊕ D4,
S2 = P2 ⊕ D1 ⊕ D3 ⊕ D4,
S3 = P3 ⊕ D2 ⊕ D3 ⊕ D4,
若 S3S2S1 的值為“000”,則說明無錯;否則說明出錯,且這個數就是錯誤的位號,如 S3S2S1 = 001,說明第一位出錯,即 H1 出錯,直接將該位取反就達到了糾錯的目的。
循環冗余校驗(CRC)碼
CRC 的基本思想是:在 K 位信息碼后再拼接 R 位的校驗碼,整個編碼長度為 N 位,因此這種碼又稱為(N,K)碼。在發送端,將要傳送的 K 位二進制信息碼左移 R 位,將它與生成多項式 G(x) 做 模2除法(不借位),生成一個 R 位校驗碼,並附在信息后,構成一個新的二進制碼(CRC碼),共 K + R 位。若 G(x) = x3 + x2 + 1,則對 1101 進行 模2除。
接收端收到的 CRC 碼為 C9C8C7C6C5C4C3C2C1,用生成多項式 G(x) 做 模2除法,若余數為 0,則碼字無錯。若余數為 010,則說明 C2 出錯。
CRC 可以糾正一位或多位錯誤(由多項式 G(x) 決定),而實際傳輸中糾正的方法可以按需求進行選擇(請求重發,刪除數據,自行糾正等)。
定點數的表示與運算
編碼方式 | 最小值編碼 | 最小值 | 最大值編碼 | 最大值 | 數值范圍 |
無符號定點整數 | 0000...000 | 0 | 1111...111 | 2n+1-1 | 0 ≤ x ≤ 2n+1-1 |
無符號定點小數 | 0.00...000 | 0 | 0.11...111 | 1-2-n | 0 ≤ x ≤ 1-2-n |
原碼定點整數 | 1111...111 | -2n+1 |
0111...111 | 2n-1 | -2n+1 ≤ x ≤ 2n-1 |
原碼定點小數 | 1.111...111 | -1+2-n | 0.111...111 | 1-2-n | -1+2-n ≤ x ≤ 1-2-n |
補碼定點整數 | 1000...000 | -2n | 0111...111 | 2n-1 | -2n ≤ x ≤ 2n-1 |
補碼定點小數 | 1.000...000 | -1 | 0.111...111 | 1-2-n | -1 ≤ x ≤ 1-2-n |
反碼定點整數 | 1000...000 | -2n+1 | 0111...111 | 2n-1 | -2n+1 ≤ x ≤ 2n-1 |
反碼定點小數 | 1.000...000 | -1+2-n | 0.111...111 | 1-2-n | -1+2-n ≤ x ≤ 1-2-n |
移碼定點整數 | 0000...000 | -2n | 1111...111 | 2n-1 | -2n ≤ x ≤ 2n-1 |
移碼定點小數 | 小數沒有移碼定義 |
正數的原碼、反碼、補碼均相同。
原碼求補碼(負數):除符號位以外,從最低位開始,遇到的第一個 1 以前的各位保持不變,之后各位取反。(或除符號位以外,各位取反,末位 + 1)
已知 [ Y ]補 求 [ -Y ]補,連同符號位求反,末位 + 1。
n + 1 位負數補碼的真值 = -2n + 除去符號位的真值。
移碼大真值就大,移碼小真值就小。
碼制 | 添補代碼 | |
正數 | 原碼、反碼、補碼 | 0 |
負數 | 原碼 | 0 |
補碼 | 左移添0 | |
右移添1 | ||
反碼 | 1 |
邏輯移位不管是左移還是右移,都添0。
循環移位分為帶進位標志位 CF 的循環移位(大循環)和不帶進位標志位的循環移位(小循環),過程如圖所示:
循環移位的主要特點是,移除的數據又被移入數據中,而 是否帶進位則要看是否將進位標志位加入循環移位。例如,帶進位的循環左移就是將數據位連同進位標志位一起左移,數據的最高位移入進位標志位 CF,而進位標志位則依次移入數據的最低位。
循環移位適合將數據的低字節數據和高字節數據互換。
原碼定點數的加減法運算:
加法規則:先判符號位,若相同,則絕對值相加。結果符號位不變;若不同。則做減法,絕對值大的數減去絕對值小的數,結果符號位與絕對值大的數相同。
減法規則:兩個原碼表示的數相減,首先將減數符號取反,然后將被減數與符號取反后的減數按原碼加法進行運算。
運算時注意機器字長,當左邊出現溢出時,將溢出位丟掉。
補碼定點數的加減法運算:
符號位與數值位按同樣的規則一起參與運算,符號位產生的進位要丟掉,結果的符號位由運算得出。
補碼運算的結果亦為補碼。
符號擴展(可參考移位規則)
在計算機算術運算中,有時必須把采用給定位數表示的數轉換成具有不同位數的某種表示形式。例如,某個程序需要將一個 8 位數與另外一個 32 位數相加,要想得到正確的結果,在將 8 位數與 32 位數相加之前,必須將 8 位數轉換成 32 位數形式,這稱為“符號擴展”。
正數的符號擴展:原有形式的符號位移動到新形式的符號位上,新表示形式的所有附加位都用 0 進行填充。
負數的符號擴展方法則根據機器數的不同而不同。原碼表示負數的符號擴展方法與正數相同,只不過此時符號位為 1。補碼表示負數的符號擴展方法:原有形式的符號位移動到新形式的符號位上,新表示形式的所有附加位都用 1(對於整數)或 0(對於小數)進行填充。反碼表示負數的符號擴展方法:原有形式的符號位移動到新形式的符號位上,新表示形式的所有附加位都用 1 進行填充。
乘法類型 | 符號位 | 累加次數 | 移位 | ||||
參與運算 | 部分積 | 乘數 | 方向 | 次數 | 每位次數 | ||
原碼一位乘法 | 否 | 2位 | 0位 | n | 右 | n | 1 |
補碼一位乘法 | 是 | 2位 | 1位 | n + 1 | 右 | n | 1 |
乘法類型 | 符號位參與運算 | 加減次數 | 移位 | 說明 | |
方向 | 次數 | ||||
原碼加減交替法 | 否 | N + 1 或 N + 2 | 左 | N | 若最終余數為負,需恢復余數 |
補碼加減交替法 | 是 | N + 1 | 左 | N | 商末尾恆置 1 |
在計算機系統中,數值一律用補碼來表示和存儲。
強制類型轉換
當大字長變量向小字長變量強制類型轉換時,系統把多余的高位字節部分直接截斷,低位直接賦值。
短字長到長字長變量的轉換,不僅要使相應的位值相等,高位部分還會擴展為原數字的符號位。
例:short x = -4321; int y = x; unsigned short u = (unsigned short) x; unsigned int v = u;
結果:x = -4321, y = -4321, u = 61215, v = 61215
x、y、u、v 的十六進制表示分別是 0xef1f、0xffffef1f、0xef1f、0x0000ef1f
類型 | 16位機器 | 32位機器 | 64位機器 |
char | 8 | 8 | 8 |
short | 16 | 16 | 16 |
int | 16 | 32 | 32 |
long | 32 | 32 | 64 |
long long | 64 | 64 | 64 |
float | 16 | 32 | 32 |
double | 64 | 64 | 64 |
數據按邊界對齊指變量的起始地址必須能夠被自身的數據類型的大小整除。
對真值 0 表示形式唯一的機器數是補碼和移碼。
使用補碼表示時,若符號位相同,則數值位越大,碼值越大。
不帶進位位的循環左移將最高位進入最低位和標志寄存器 C 位。
8421碼是十進制數的編碼。
存儲模4補碼(變形補碼,雙符號位)僅需一個符號位,因為正確的數值兩個符號位相同,只在 ALU 中采用雙符號位。
在計算機中,通常用無符號數來表示主存地址。
浮點數的表示與運算
左規:當浮點數運算的結果為非規格化時要進行規格化處理,將尾數算術左移一位,階碼減1(基數為2時)的方法稱為左規,左規可能要進行多次。
右規:當浮點數運算的結果尾數出現溢出(雙符號位為 01 或 10)時,將尾數算術右移一位,階碼加 1(基數為2時)的方法稱為右規。需要右規時,只需進行一次。
(1)原碼規格化后。
正數為 0.1xx...x的形式,其最大值表示為 0.11...1,最小值表示為 0.10...0。
尾數的表示范圍為 1/2 ≤ M ≤ (1-2-n)
負數為 1.1xx...x的形式,其最大值表示為 1.10...0,最小值表示為 1.11...1。
尾數的表示范圍為 -(1-2-n) ≤ M ≤ -1/2。
(2)補碼規格化后
正數為 0.1xx...x的形式,其最大值表示為 0.11...1,最小值表示為 0.10...0。
尾數的表示范圍為 1/2 ≤ M ≤ (1-2-n)
負數為 1.0xx...x的形式,其最大值表示為 1.01...1,最小值表示為 1.0...0。
尾數的表示范圍為 -1 ≤ M ≤ -(1-2-n)。
補碼規格化數的尾數最高為一定與尾數符號位相反。
運算結果大於最大正數時稱為正上溢,小於絕對值最大負數時稱為負上溢,正上溢和負上溢統稱為上溢。數據一旦產生上溢,計算機必須中斷運算操作,進行溢出處理,當運算結果在 0 至最小正數之間時稱為正下溢,在 0 至絕對值最小負數之間時稱為負下溢,正下溢和負下溢統稱為下溢。數據下溢時,浮點數值趨於零,計算機僅將其當作機器零處理。
IEEE 754 標准
類型 | 數符 | 階碼 | 尾數數值 | 總位數 | 偏置值 | |
十六進制 | 十進制 | |||||
短浮點數(FLOAT) | 1 | 8 | 23 | 32 | 7FH | 127 |
長浮點數(DOUBLE) | 1 | 11 | 52 | 64 | 3FFH | 1023 |
臨時浮點數 | 1 | 15 | 64 | 80 | 3FFFH | 16383 |
數符 | 階碼 | 尾數 |
計算所得階碼需加上偏置值,以移碼形式表示。對於規格化的二進制浮點數,數值的最高位總是“1”,為了能使尾數多表示一位有效位,將這個“1”隱含,因此尾數數值實際上是24位。
階碼以移碼形式表示,尾數以原碼形式表示。
階碼全 1 表示無窮大,全 0 表示非規格化數。
浮點數的加減運算:(1)對階。小階向大階看齊。(2)尾數求和(3)規格化(4)舍入。“0”舍“1”入法;恆置“1”法。(5)溢出判斷(6)強制類型轉換
采用規格化的浮點數主要是為了增加數據的表示精度。
對階操作不存在階碼減小(小階向大階看齊)。
舍入是浮點數的概念,定點數沒有舍入的概念。浮點數舍入的情況有兩種:對階、右規格化。
對階操作不會引起階碼上溢或下溢。右規和尾數舍入都可能引起階碼上溢。左規時可能引起階碼下溢。尾數溢出時結果不一定溢出。
設階碼和尾數均用補碼表示,階碼部分共 K + 1 位(含 1 位階符),尾數部分共 n + 1 位(含 1 位數符),則
浮點數 | 浮點表示 | 真值 | |
階碼 | 尾數 | ||
最大正數 | 01...1 | 0.11...11 | (1 - 2-n) * 2^(2k - 1) |
絕對值最大負數 | 01...1 | 1.00...00 | -1 * 2^(2k - 1) |
最小正數 | 10...0 | 0.00...01 | 2-n * 2^(-2k) |
規格化的最小正數 | 10...0 | 0.10...00 | 2-1 * 2^(-2k) |
絕對值最小負數 | 10...0 | 1.11...11 | -2-n * 2^(-2k) |
規格化的絕對值最小負數 | 10...0 | 1.01...11 | -(2-1 + 2-n) * 2 ^(-2k) |
算術邏輯單元(ALU)
1. 一位全加器
全加器(FA)是最基本的加法單元,有加數 Ai、加數 Bi 與低位傳來的進位 Ci-1 共三個輸入有 本位和 Si 與向高位的進位 Ci 共兩個輸出。
和表達式:Si = Ai ⊕ Bi ⊕ Ci-1 (Ai、Bi、Ci-1 中有奇數個 1 時,Si = 1;否則 Si = 0)
進位表達式:Ci = AiBi + (Ai ⊕ Bi)Ci-1
2.串行加法器
在串行加法器中,只有一個全加器,數據逐位串行送入加法器中進行運算。若操作數長 n 位,則加法器就要分 n 次進行,每次產生一位和,並且串行逐位送回寄存器。進位觸發器用來寄存進位信號,以便參與下一次運算。
串行加法器具有器件少、成本低的優點,但運算速度慢,多用於某些低速的專用運算器。
3.並行加法器
並行加法器由多個全加器組成,其位數與機器的字長相同,各位數據同時運算。並行加法器中的每個全加器都有一個從低位送來的進位輸出和一個傳送給高位的進位輸出,通常將傳遞進位信號的邏輯線路連接起來構成的幾位內網絡稱為進位鏈。
並行加法器的進位通常分為串行進位與並行進位。
- 串行進位。把 n 個全加器串接起來,就可以進行兩個 n 位數的相加,這種加法器稱為串行進位的並行加法器。串行進位又稱行波進位,每級進位直接依賴於前一級的進位,即進位信號是逐級形成的。如圖:
- 並行進位。並行進位又稱先行進位、同時進位,其特點是各級進位信號同時形成。
- 上述各式所有的進位輸出僅由 Gi、Pi及最低進位輸入 C0 決定,而不依賴於其低位的進位輸入 Ci-1 ,因此各級進位輸出可以同時產生。這種進位方式是快速的,與字長無關。
分組並行進位方式,把 n 位全加器分為若干小組,小組內的各位之間實行並行快速進位,小組與小組之間可以采用串行進位方式,也可以采用並行快速進位方式,因此有以下兩種情況:
ALU 是一種功能較強的組合邏輯電路。
74181 為 4 位並行加法器,其 4 位進位是同時產生的,用 4 片 74181 芯片可組成 16 位 ALU。其片內進位是快速的,但片間進位是逐片傳遞的,即組內並行(74181 片內)、組間串行(74181 片間)。
若把 16 位 ALU 中的每 4 位作為一組,即將 74181 與 74182 芯片(先行進位芯片)配合,用類似位間快速進位的方法來實現 16 位 ALU(4 片 ALU 組成),則能得到 16 位的兩級先行進位 ALU,即組內並行(74181 片內)、組間並行(74181 片間)。
在串行進位的並行加法器中,影響加法器運算速度的關鍵因素是進位傳遞延遲。
地址寄存器不屬於運算器,而屬於存儲器。狀態寄存器、數據總線、ALU 均是組成運算器的部件。
以上內容均來自王道書籍及相關課程等