计算机组成原理 · 2027 考研计算机 408

第 2 章 数据的表示和运算

目标院校:四川大学 / 电子科技大学 | 建议用时:概念 4 小时 + 例题练习 6 小时

本章地位:组成原理中计算题最密集的一章,也是选择题的「弹药库」:IEEE 754 转换、补码溢出判断、海明码分组、CRC 模 2 除法几乎每年都在卷面上出现。真题套路高度固定——按步骤逐位演算、结果自检即可拿满分;失分几乎都失在「跳步」上。本章每道例题都把每一步展开到二进制位,并附数值核对,请务必跟着动笔算一遍。

2.1 进位计数制与编码

2.1.1 r 进制及其互相转换

位权展开\(r\) 进制数每一位的权是 \(r\) 的幂。例如二进制数 \[ (1100.11)_2=1\times2^{3}+1\times2^{2}+1\times2^{-1}+1\times2^{-2}=12.75 \] 常用进制:二进制(机器内部)、八进制、十六进制(书写压缩,1 位十六进制 = 4 位二进制)、十进制(人读)。下标省略时本章二进制数按位分组书写,如 1000 0010。
转换方法十进制 → r 进制:整数部分「除基取余,余数倒排」;小数部分「乘基取整,整数顺排」。
二进制 ↔ 八 / 十六进制:分组法——整数从小数点向左、小数向右,每 3 位(八进制)或 4 位(十六进制)一组,不足补 0。
例 1 高频考点 进制转换(含精度陷阱)

(1) 将十进制数 41.375 转换为二进制和十六进制;(2) 说明为什么十进制小数 0.3 无法用有限位二进制精确表示。

查看解答

(1) 整数部分(除 2 取余,余数从下往上读):

\(41\div2=20\cdots1\);\(20\div2=10\cdots0\);\(10\div2=5\cdots0\);\(5\div2=2\cdots1\);\(2\div2=1\cdots0\);\(1\div2=0\cdots1\) → \(41=(101001)_2\)

小数部分(乘 2 取整,整数从上往下读):\(0.375\times2=0.75\) 取 0;\(0.75\times2=1.5\) 取 1;\(0.5\times2=1.0\) 取 1 → \(0.375=(0.011)_2\)

故 \(41.375=(101001.011)_2\)。十六进制分组:\(0010\,1001\,.\,0110\) → 29.6H。核对:\(32+8+1+0.25+0.125=41.375\) ✓;\(2\times16+9+6/16=41.375\) ✓。

(2) 对 0.3 连续乘 2 取整:\(0.3\to0.6(0)\to1.2(1)\to0.4(0)\to0.8(0)\to1.6(1)\to1.2(1)\to\cdots\),出现 \(0.6\to1.2\to0.4\to0.8\to1.6\to1.2\) 的循环,得 \(0.3=(0.0100\,1100\,1100\cdots)_2\)("1100" 无限循环)。因此十进制小数转二进制可能无限不精确,机器只能按字长截断 / 舍入——这就是 0.1+0.2 ≠ 0.3(见 2.3 节 C 演示与 2.5 节舍入)的根源。

2.1.2 BCD、ASCII 与汉字编码

8421 BCD 码用 4 位二进制表示 1 位十进制数字(0000~1001),1010~1111 六个编码非法。两个 BCD 码相加:若本位结果 > 9(即出现非法码或产生进位),须加 6(0110)修正,因为 4 位二进制逢 16 进位,而十进制要逢 10 进位,差 6。
例 2 BCD 加法修正

用 8421 BCD 码计算 8+5 与 9+8。

查看解答

8+5:\(1000+0101=1101\)(13,是非法码)→ 加 6 修正:\(1101+0110=1\,0011\),即十位 1、个位 3 → 结果 13 ✓。

9+8:\(1001+1000=1\,0001\)(本位 0001、向高位进位 1)→ 因产生进位须修正:\(0001+0110=0111\) → 十位 1、个位 7 → 结果 17 ✓。

套路总结:结果 > 9 或出现进位就 +6;修正若再产生进位,进位正是给上一位十进制数的。

ASCII 与汉字ASCII 用 7 位二进制表示 128 个字符(数字 0~9 为 30H~39H,大写 41H~5AH,小写 61H~7AH,空格 20H);存放时第 8 位常作奇偶校验位(见 2.2)。汉字:国标码(GB2312 双字节、每字节最高位为 0)在机内将每字节最高位置 1 得机内码(= 国标码 + 8080H),以与 ASCII 区分——知道这一句区别即可,不展开。
练习 1

将十进制数 25.25 分别转换为二进制与十六进制。

查看答案

整数:\(25=16+8+1=(11001)_2\);小数:\(0.25\times2=0.5(0)\),\(0.5\times2=1.0(1)\) → \(0.01\)。故 \(25.25=(11001.01)_2=0001\,1001\,.\,0100\) = 19.4H。核对:\(16+8+1+0.25=25.25\) ✓;\(1\times16+9+4/16=25.25\) ✓。

2.2 校验码:奇偶 / 海明 / CRC 高频考点

2.2.1 码距与奇偶校验

码距(海明距离)两个合法编码之间不同二进制位数的最小值称为该编码系统的码距 \(d\)。检出 \(e\) 位错需 \(d\ge e+1\);纠正 \(e\) 位错需 \(d\ge 2e+1\)。因此:检 1 位错需 \(d\ge2\);纠 1 位错(纠一检一)需 \(d\ge3\);纠 1 位同时检 2 位(纠一检二)需 \(d\ge4\)。
奇偶校验添加 1 位校验位,使整个码字中 1 的个数为奇数(奇校验)或偶数(偶校验)。码距为 2:能发现 1 位(及任何奇数位)出错,但不能定位、不能纠错,偶数位错检测不出。例:数据 1011010 有 4 个 1,配偶校验位 = 0、奇校验位 = 1。

2.2.2 海明码:分组 + 纠错

校验位数公式设信息 \(n\) 位、校验 \(k\) 位,\(k\) 个校验位的状态组合要能区分「无错 + \(n+k\) 个单错位置」,故要求 \[ 2^{k}\ge n+k+1 \] 常用结论:\(n=4\to k=3\)(\(2^3=8\ge4+3+1=8\) ✓);\(n=8\to k=4\)(\(2^4=16\ge8+4+1=13\) ✓,注意 \(2^3=8\lt13\) 不够,别多算成 5 或少算成 3)。
排列与分组规则① 校验位 \(P_i\) 放在位号为 \(2^{i-1}\) 的位置(第 1、2、4、8…位),信息位按序填入其余位置;
② 第 \(i\) 个校验位校验「位号的二进制展开中第 \(i\) 位为 1」的所有位(按偶校验配置);
③ 纠错时算出各组的校验方程 \(S_i\),\(S_k\cdots S_2S_1\) 拼成的二进制数就是出错位的位号,将该位取反即纠错;全 0 表示无错。
例 3 高频考点 海明码求解与纠错

设信息位 D = 1010(D₄D₃D₂D₁ = 1,0,1,0)。(1) 求偶校验配置的海明码(整体 7 位);(2) 若接收到 H₇..H₁ = 1000010,判断哪一位出错并纠正。

查看解答

(1) 定位:\(k=3\)(\(2^3=8\ge4+3+1\)),共 7 位,位号 1~7:H₁=P₁、H₂=P₂、H₃=D₁、H₄=P₃、H₅=D₂、H₆=D₃、H₇=D₄(自左向右 H₃..H₇ 依次落入 D₁,D₂,D₃,D₄ = 0,1,0,1)。

求校验位(每组使 1 的个数为偶数):

P₁(校验 H₁,H₃,H₅,H₇):\(P_1=D_1\oplus D_2\oplus D_4=0\oplus1\oplus1=0\)
P₂(校验 H₂,H₃,H₆,H₇):\(P_2=D_1\oplus D_3\oplus D_4=0\oplus0\oplus1=1\)
P₃(校验 H₄,H₅,H₆,H₇):\(P_3=D_2\oplus D_3\oplus D_4=1\oplus0\oplus1=0\)

发送码字 H₇..H₁ = D₄ D₃ P₃ D₂ D₁ P₂ P₁ = 1001010。

(2) 纠错:收到的 H₁..H₇ = 0,1,0,0,0,0,1,逐组重算:

\(S_1=H_1\oplus H_3\oplus H_5\oplus H_7=0\oplus0\oplus0\oplus1=1\)
\(S_2=H_2\oplus H_3\oplus H_6\oplus H_7=1\oplus0\oplus0\oplus1=0\)
\(S_3=H_4\oplus H_5\oplus H_6\oplus H_7=0\oplus0\oplus0\oplus1=1\)

\(S_3S_2S_1=101_2=5\) → 第 5 位(H₅ = D₂)出错,由 0 纠正为 1,码字恢复为 1001010,取出信息位 D₄D₃D₂D₁ = H₇,H₆,H₅,H₃ = 1,0,1,0 = 1010 ✓(正是 D₂ 被 1→0 翻转的情形)。

套路总结:海明码题三步——定位(2 的幂放校验位)→ 列各组的异或方程求 P → 收端重算 S 拼位号。S 全 0 无错;S 非 0 直接指出位号。

2.2.3 循环冗余校验码(CRC)

CRC 原理给定生成多项式 \(G(x)\)(设为 \(r+1\) 位):信息码左移 \(r\) 位(末尾补 \(r\) 个 0),对 \(G(x)\) 做模 2 除法(异或运算,不借位不进位),所得 \(r\) 位余数拼接在信息码之后即为 CRC 码字。接收端用同一 \(G(x)\) 再除:余数为 0 判无错。不同出错位对应不同余数(循环码特性),故 CRC 检错能力极强,但通常只检不纠(出错则重传)。
例 4 方法 CRC 模 2 除法逐步演算

信息码 M = 1010,生成多项式 \(G(x)=x^{3}+x+1\)。求 CRC 码字,并验证接收端除法余数为 0。

查看解答

\(G(x)=x^3+x+1\) 对应二进制 1011(最高次 3 → 余数 3 位)。M 左移 3 位:被除数 1010 000。模 2 除法(逐位异或):

① 取被除数前 4 位 1010:首位 1 → 商 1,\(1010\oplus1011=0001\);
② 落下一位 0 → 00010,看低 4 位 0010:首位 0 → 商 0;
③ 落下一位 0 → 0100:首位 0 → 商 0;
④ 落下最后一位 0 → 1000:首位 1 → 商 1,\(1000\oplus1011=0011\);位已用尽。

商 = 1001(不需要),余数 R = 011。CRC 码字 = 信息码 + 余数 = 1010 011 = 1010011。

验证:接收端 1010011 ÷ 1011:\(1010\oplus1011=0001\),落 0 → 0010(商 0),落 1 → 0101(商 0),落 1 → 1011,\(1011\oplus1011=0000\)(商 1)→ 余数 000 ✓ 无错。

若最低位出错收到 1010010,同样除法余数为 001 ≠ 0 → 判错请求重传(余数与出错位一一对应,但一般不用于纠错)。

练习 2 易错

(1) 要纠正 1 位错并同时发现 2 位错,码距至少为多少?(2) 奇偶校验为何不能发现 2 位同时出错?(3) 信息 8 位,海明校验位应为几位?

查看答案

(1) 纠一检二需 \(d\ge4\)。(纠一检一 \(d\ge3\),注意区分这两个常考结论。)

(2) 2 位同时翻转,1 的个数的奇偶性不变,校验方程仍满足,故检测不出——这正是奇偶校验码距仅为 2 的体现。

(3) \(2^k\ge8+k+1\):\(k=3\) 时 \(8\lt12\) 不够;\(k=4\) 时 \(16\ge13\) ✓ → 4 位(信息 4 位才是 3 位)。

2.3 定点表示与运算

2.3.1 原码 / 反码 / 补码 / 移码

四种机器码定点小数默认小数点在符号位后、定点整数默认在最低位后,以下按 8 位整数(1 位符号 + 7 位数值)总结:
  • 原码:符号位 + 绝对值。0 有两个(+0 = 0000 0000,−0 = 1000 0000);
  • 反码:正数同原码;负数 = 原码数值位按位取反。0 也有两个;
  • 补码:正数同原码;负数 = 反码末位 + 1。0 唯一;多表示一个负数 −128;加减法统一为加法;
  • 移码:真值 + 偏置(8 位偏置 2⁷ = 128),即补码的符号位取反。常用于表示浮点阶码,直接按无符号数比较大小;0 唯一。
码制(8 位)表示范围0 的个数特殊值
原码−127 ~ +1272 个−0 = 1000 0000
反码−127 ~ +1272 个−0 = 1111 1111
补码−128 ~ +1271 个[−128]补 = 1000 0000(无对应原码)
移码−128 ~ +1271 个[−128]移 = 0000 0000,[0]移 = 1000 0000
例 5 真值 ⇄ 四种机器码、求 [−x]补

设 x = −45(8 位)。(1) 写出 [x]原、[x]反、[x]补、[x]移;(2) 由 [x]补 求 [−x]补;(3) 写出 [x]补 的 16 位符号扩展。

查看解答

(1) 先定数值位:\(45=32+8+4+1=(0101101)_2\)(7 位数值位,\(32+0+8+4+0+1=45\) ✓)。

[x]原 = 1010 1101(符号 1 + 45);
[x]反 = 数值位取反 = 1101 0010;
[x]补 = 反码 + 1 = 1101 0011。核对:\(-128+64+16+2+1=-45\) ✓。
[x]移 = 补码符号位取反 = 0101 0011(= −45+128 = 83 ✓)。

(2) 由 [x]补 求 [−x]补:连同符号位一起取反,末位加 1:1101 0011 → 0010 1100 → +1 = 0010 1101 = 45 ✓。

(3) 符号扩展(8 → 16 位):x 为负,高位补符号位 1 → 1111 1111 1101 0011。核对:\(-32768+16384+\cdots\),其值不变仍为 −45(高 8 位 1111 1111 的权恰好抵消)✓。正数则高位补 0,如 [+5]补 8 位 0000 0101 → 16 位 0000 0000 0000 0101。

易错:求 [−x]补 是「连同符号位取反加 1」,不是只翻转符号位;[−128]补 求反加 1 会溢出(8 位无 +128),故 −128 没有 [−x]补。

2.3.2 补码加减法与溢出判断

补码加减公式\([x+y]_{补}=[x]_{补}+[y]_{补}\)(模 2ⁿ,丢弃超出字长的进位);\([x-y]_{补}=[x]_{补}+[-y]_{补}\)。减法化为加法,这是补码存在的意义——加减共用一套加法器。
例 6 补码加法逐位演算(含丢弃进位)

用 8 位补码计算 −5+3,写出逐位过程并核对。

查看解答

[−5]补:5 = 0000 0101 → 取反 1111 1010 → +1 = 1111 1011;[3]补 = 0000 0011。

\[ \begin{array}{r} 1111\ 1011\\ +\quad 0000\ 0011\\ \hline 1\ 1111\ 1110 \end{array} \]

最高位进位 1 超出 8 位字长,丢弃(模 2⁸),结果 [x+y]补 = 1111 1110 = \(-128+64+32+16+8+4+2=-2\) ✓(−5+3 = −2)。两异号数相加必不溢出,此处只是自然回绕。

溢出判断三法只有同号相加(或异号相减)才可能溢出。设符号位为 S:
  1. 一位符号位(操作数法):两同号操作数之和的符号与之相反 → 溢出;
  2. 进位法:符号位进位 \(C_s\) 与最高数值位进位 \(C_1\) 异或为 1 → 溢出;
  3. 双符号位(变形补码):00 正、11 负;结果符号 01 → 正溢,10 → 负溢。最高符号位永远代表真正符号。
−1 + 1 = 0:模 2⁸ 自然回绕,不溢出 同号相加越过此缝 = 溢出 0000 0000 = 0 1111 1111 = −1 0111 1111 = +127 1000 0000 = −128 8 位补码圆 加正数顺时针 · 加负数逆时针 把 256 个补码首尾相接成圆环: 加法 = 沿圆周走若干格,符号只是"所在的半圈"。 穿过顶部 0 缝:进位自然消失(模系统),结果正确; 穿过底部 127/−128 缝:正负号跳变,即溢出。 +127 + 1 → −128(正溢) −128 − 1 → +127(负溢) 双符号位就是把底部这条缝"复印"进符号位:01 正溢、10 负溢。
图 2-2 补码圆与溢出判断:溢出的本质是越过 +127 ↔ −128 边界使符号跳变;跨过 0 点只是模回绕(对应例 6 丢弃的进位)
例 7 高频考点 双符号位判溢出

用变形补码(双符号位)计算 8 位下的 65+66 与 (−65)+(−66),判断是否溢出。

查看解答

① 65+66:[65]补 = 0100 0001、[66]补 = 0100 0010;双符号位 00 100 0001 + 00 100 0010:

\[ 00\,1000001 + 00\,1000010 = 01\,0000011 \]

双符号位 = 01 → 正溢 ✓(65+66 = 131 > 127,确已超出 8 位补码上限)。

② (−65)+(−66):[−65]补 = 1011 1111(= −128+63 ✓)、[−66]补 = 1011 1110;双符号位相加:

\[ 11\,0111111 + 11\,0111110 = 1\,10\,1111101 \xrightarrow{\text{丢最高进位}} 10\,1111101 \]

双符号位 = 10 → 负溢 ✓(−131 < −128,超出下限;丢弃进位后最高符号位 1,真正符号仍为负)。

套路总结:双符号位口诀「结果 00/11 才正常,01 正溢、10 负溢」;单符号位进位法 \(C_s\oplus C_1=1\) 判溢出,两法结论必一致。

// 整型溢出演示:补码运算的"回绕"在 C 语言中的表现

#include <stdio.h>
int main() {
    int i = 2147483647;          // 32 位 int 最大值 (2^31 - 1)
    printf("%d\n", i + 1);       // 正溢:输出 -2147483648(回绕到补码最小负数)
    unsigned char c = 255;       // 8 位无符号数最大值
    c = c + 1;                   // 模 256 回绕
    printf("%u\n", c);           // 输出 0
    return 0;
}
练习 3 真题风格

已知 [x]补 = 90H(8 位)。(1) 求 x 的真值;(2) 求 [−x]补;(3) 求 [x]移。

查看答案

(1) 90H = 1001 0000,符号 1 为负:\(-128+16=-112\)。

(2) 连同符号位取反加 1:0110 1111 → +1 = 0111 0000(= 112 = −x ✓,即 70H)。

(3) [x]移 = 补码符号位取反 = 0001 0000(= −112+128 = 16 ✓)。

2.4 定点乘除与移位

2.4.1 算术移位与逻辑移位

运算左移右移含义
算术移位低位补 0(可能溢出)高位补符号位符号数:左移 ×2、右移 ÷2
逻辑移位低位补 0高位补 0无符号数 / 位串的平移
补码算术右移补码正数右移高位补 0、负数右移高位补 1。例:[x]补 = 1010(4 位,x = −6)算术右移 1 位 → 1101(= −3 = −6÷2 ✓);若错按逻辑右移得 0101(+5),数值全错。左规 / 右规、Booth 乘法用的都是算术右移。
练习 4

设 [x]补 = 1110 0000(8 位)。求 x 的真值,并给出算术右移 2 位后的机器数与真值。

查看答案

x = \(-128+64+32=-32\)。算术右移 1 位 → 1111 0000(−16),再右移 1 位 → 1111 1000 = \(-128+120=-8\) ✓(−32÷4 = −8,高位始终补符号 1)。

2.4.2 原码一位乘与补码 Booth 乘法

原码一位乘符号与数值分开处理:积符号 = 两数符号位异或;数值部分取绝对值相乘。规则:部分积 P 初值 0,从乘数最低位起,该位为 1 则 P 加 |x|、为 0 则不加,随后 P 与乘数寄存器联合右移一位(P 高位补 0);n 位数共 n 步,移出的位依次成为乘积的低位。
例 8 原码一位乘逐步演算(3 位小数)

设 x = −0.101,y = 0.011,用原码一位乘法求 x·y。

查看解答

数值部分 |x| = 0.101(记 101),|y| = 0.011(乘数寄存器 R 初值 011);部分积 P 初值 000。

步骤判断位(R 末位)操作部分积 P乘数 R
初态——000011
11P+101 = 101,右移010101
21P+101 = 111,右移011110
30P+000 = 011,右移001111

数值积 = P ‖ R = 001 111,即 0.001111;符号位 = 1⊕0 = 1,故 x·y = −0.001111。

核对:\(|x|\cdot|y|=\frac{5}{8}\times\frac{3}{8}=\frac{15}{64}\),而 \(0.001111=\frac{15}{64}\) ✓。

补码 Booth 乘法(比较法)符号位参与运算,无需单独处理。附加位 \(y_{n+1}=0\) 起步,每步看最低位与附加位组成的两位:
判断位 \(y_i\,y_{i+1}\)操作
0 0 或 1 1部分积 + 0,右移一位
0 1部分积 + [x]补,右移一位
1 0部分积 + [−x]补,右移一位
部分积与乘数寄存器(含符号位与附加位)联合算术右移(补符号),最后一步只加不移。口诀「01 加 x、10 减 x」。
例 9 高频考点 Booth 乘法逐步演算

设 x = 0.101,y = 0.011(4 位含符号),用 Booth 算法求 x·y。

查看解答

[x]补 = 00.101(双符号位),[−x]补 = 11.011(取反加 1:00.101 → 11.010 → +1 ✓)。部分积 A 初值 00.000;乘数(含符号位)y₀y₁y₂y₃ = 0011,附加位 y₄ = 0。

步骤判断位操作部分积 A
初态——00.000
1y₃y₄ = 10+11.011 = 11.011,算术右移11.101
2y₂y₃ = 11+0,算术右移11.110
3y₁y₂ = 01+00.101 → 100.011 = 00.011,算术右移00.001
4y₀y₁ = 00+0,不移位00.001

逐步核对:① 00.000+11.011 = 11.011,右移补符号 1 → 11.101(移出 1);② +0 右移 → 11.110(移出 1);③ 11.110+00.101 = 100.011,双符号位吸收进位得 00.011,右移 → 00.001(移出 1);④ 判断乘数符号位组 00,只加不移。

乘积高位 = A 的数值 001;三次右移移出位(先出者在最低)为 1、1、1,即积的低 3 位 = 111。故 x·y = 0.001111,核对 \(\frac{5}{8}\times\frac{3}{8}=\frac{15}{64}=0.001111_2\) ✓(与例 8 符号数值均一致,两法互验)。

2.4.3 除法:原码加减交替法

加减交替(不恢复余数)法上商与加减由余数符号决定:余数为正 → 商 1,下一步左移后减 |y|;余数为负 → 商 0,下一步左移后加 |y|。n 位数共 n 步;若最终余数为负须恢复余数(+|y|),商的符号同样由两数符号异或决定。要求 |被除数| < |除数| 且除数非 0,否则溢出。
练习 5 方法

设 x = 0.011,y = 0.100,用原码加减交替法求 x/y(写出逐步过程)。

查看答案

|x| = 0.011,|y| = 0.100,[−|y|]补 = 1.100。余数寄存器 R 初值 = |x| = 0.011,第一步先试减:

步骤操作余数 R商
1R−|y|:0.011+1.100 = 1.111 < 01.111(=−0.001)0
2左移 → 11.110;R+|y|:11.110+00.100 = 100.010 → 00.010 ≥ 000.010(=+0.010)1
3左移 → 00.100;R−|y|:00.100+11.100 = 100.000 → 00.000 ≥ 000.0001

商 = 0.011,最终余数为正(0.000),无需恢复。符号 = 0⊕0 = 0,故 x/y = +0.011,余 0.000。

核对:\(|y|\times商=0.100\times0.011=0.011=|x|\),余数 0 ✓(即 \(3/8\div1/2=3/4\))。

2.5 浮点表示与运算 高频考点

浮点数构成\(N = M\times r^{E}\):尾数 \(M\)(决定精度)+ 阶码 \(E\)(决定范围)+ 基数 \(r\)。尾数用原码 / 补码,阶码用移码(便于直接比较大小、判断对阶)。规格化要求尾数最高数值位为有效值,以充分利用位数、保证精度唯一。

2.5.1 IEEE 754 单精度格式

规格化数公式单精度共 32 位:符号 1 位 + 阶码 8 位 + 尾数 23 位,偏置值 127,尾数隐含整数位 "1.": \[ N=(-1)^{S}\times 1.M\times 2^{\,E-127} \qquad (1\le E\le 254) \] 双精度(64 位):1 + 11 + 52,偏置值 1023,公式同形(\(2^{E-1023}\))。
IEEE 754 单精度(32 位)三段式布局 符号 S 阶码 E(8 位,偏置 127) 尾数 M(23 位,隐含前导 "1.") 1 1000 0010 1001 1000 0000 0000 0000 000 位 31 位 30 … 23 位 22 … 0 上图以 −12.75 为例:S = 1,E = 130(真指数 3),M = 1001 1000…0 N = (−1)^S × 1.M × 2^(E−127) = −1.10011₂ × 2³ = −1100.11₂ = −12.75(演算见例 10)
图 2-1 IEEE 754 单精度格式:1 位符号 + 8 位阶码(偏置 127)+ 23 位尾数(隐藏位 1. 使精度多一位,相当于 24 位有效尾数)
例 10 高频考点 十进制 → IEEE 754 单精度

将十进制数 −12.75 转换为 IEEE 754 单精度格式,写出十六进制结果。

查看解答

① 符号:负数 → S = 1。

② 二进制:\(12=1100\),\(0.75=0.11\) → \(12.75=1100.11\)(核对 \(8+4+0.5+0.25=12.75\) ✓)。

③ 规格化:小数点左移 3 位:\(1100.11=1.10011\times2^{3}\)。

④ 阶码:\(E=3+127=130=1000\,0010\)(核对 \(128+2=130\) ✓)。

⑤ 尾数:去掉隐含的 "1.",M = 100 1100 0000 0000 0000 0000(10011 后补 18 个 0,共 23 位)。

拼接:1 | 1000 0010 | 1001 1000 0000 0000 0000 0000,按 4 位分组:
1100 0001 0100 1100 0000 0000 0000 0000 = 0xC14C0000。

反向核对:0xC14C0000 → S=1;E=130 → 指数 3;1.M = 1.10011 → \(1.10011_2\times8=12.75\),添负号 ✓。

例 11 IEEE 754 → 十进制

将单精度数 0x41C80000 转换为十进制。

查看解答

展开二进制:0x41C80000 = 0100 0001 1100 1000 0000 0000 0000 0000。

① S = 0(正数);② E = 1000 0011 = 131 → 真指数 = 131−127 = 4;③ M = 100 1000 0…0 → 1.M = 1.1001。

\[ N=1.1001_2\times2^{4}=11001_2=16+8+1=\mathbf{25.0} \]

核对:1.1001₂ = 1.5625,× 16 = 25 ✓。

套路总结:双向转换五步——符号 / 二进制 / 规格化 / 阶码(真指数 ±127)/ 尾数(去掉或补回隐含 1.),最后按 4 位分组写十六进制。

特殊值(看阶码全 0 / 全 1)E = 0 且 M = 0 → ±0;E = 0 且 M ≠ 0 → 非规格化数(公式变为 \((-1)^S\times0.M\times2^{-126}\),用于渐进下溢);E = 255 且 M = 0 → ±∞;E = 255 且 M ≠ 0 → NaN。规格化数绝对值范围约为 \(2^{-126}\sim(2-2^{-23})\times2^{127}\)。

2.5.2 浮点加减运算五步法

五步口诀① 对阶:求阶差,小阶向大阶看齐(小阶尾数右移,丢低位损失小;大阶向小阶要左移尾数、丢高位会丢有效数字,故不可);
② 尾数加减(用双符号位补码);
③ 规格化:尾数溢出(符号 01/10)或出现非规格化形式 → 右规(尾数右移 1 位、阶码 +1)/ 左规(尾数左移 1 位、阶码 −1);
④ 舍入:右移丢失位按 0 舍 1 入(丢 1 则末位 +1)或恒置 1 / 截断处理;
⑤ 判溢出:阶码上溢才是真溢出(中断 / 置无穷),尾数"溢出"可被右规修复,阶码下溢一般按机器零处理。
例 12 真题风格 浮点加法全过程

设浮点数字长:阶码 3 位(补码,含 1 位符号)、尾数 5 位(补码,双符号 + 4 数值位)。阶码按二进制书写:\(x=2^{10_{2}}\times0.1110\),\(y=2^{01_{2}}\times0.1000\),求 x+y(按五步法逐步执行)。

查看解答

① 对阶:阶差 \(10_2-01_2=1\),y 阶小 → y 尾数算术右移 1 位:\(0.1000\to0.0100\,|\,0\)(移出 0 暂存,用于舍入),y 变为 \(2^{10_{2}}\times0.0100\)。

② 尾数相加(双符号位):\(00.1110+00.0100=01.0010\)。

③ 规格化:双符号 01 → 尾数溢出,右规:右移 1 位得 \(00.1001\),阶码 +1 → \(2^{11_{2}}\)。

④ 舍入:右规移出位为 0 → 0 舍(0 舍 1 入法下不入),尾数仍 0.1001。

⑤ 判溢出:阶码为 \(011_{2}=3\)(存储 011),未超过 3 位补码阶码的表示范围(−4~+3)→ 无溢出。

结果 \(x+y=2^{11_{2}}\times0.1001\)。核对:\(x=0.875\times4=3.5\),\(y=0.5\times2=1.0\),\(3.5+1.0=4.5\);而 \(0.1001_2\times8=4.5\) ✓(本例恰好无精度损失)。

易错:对阶永远右移小阶尾数;尾数符号 01/10 不是最终溢出,先右规再说;只有第 ⑤ 步阶码溢出才报浮点溢出。

2.5.3 浮点与定点的比较

维度定点数浮点数
表示范围小(8 位仅 −128~127)大(阶码扩范围,单精度可达 10³⁸ 量级)
精度全范围等精度相对精度恒定,绝对精度随阶码浮动
运算速度快(直接加减)慢(对阶、规格化、舍入多步)
溢出判断结果超范围即溢出仅阶码溢出才是溢出,尾数溢出可右规挽救
练习 6 高频考点

将 IEEE 754 单精度数 0x42280000 转换为十进制。

查看答案

0100 0010 0010 1000 …:S = 0;E = 1000 0100 = 132 → 指数 5;M = 010 1000…0 → 1.M = 1.0101。

\(N=1.0101_2\times2^5=101010_2=32+8+2=\mathbf{42.0}\)。核对:1.0101₂ = 1.3125 × 32 = 42 ✓。

2.6 章末自测 真题风格

限时 60 分钟,先动笔逐位演算再对答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。所有结果都要像正文一样用十进制核对一遍。

自测 1(选择 · ★★)

8 位补码 1000 0000 表示的十进制数是( )
A. 0 B. −0 C. −128 D. −127

查看答案

C。补码 1000 0000 是特例:符号位 1、数值位全 0,真值 \(=-2^{7}=-128\),它没有对应的原码 / 反码。补码正是靠这个特例比原码多表示一个负数(−128~127 共 256 个数)。

自测 2(选择 · ★★★)

x = −53(8 位),则 [x]补 为( )
A. 1100 1011 B. 1011 0101 C. 1100 1100 D. 1011 0110

查看答案

A。\(53=32+16+4+1=0110\,0101\) → 取反 \(1001\,1010\) → +1 = 1001 1011。核对 \(-128+64+8+2+1=-53\) ✓。B 是原码,C 多加了 1,D 是原码取反(反码)。

自测 3(计算 · ★★)

将十进制数 20.625 分别转换为二进制与十六进制。

查看答案

整数 \(20=10100_2\);小数 \(0.625\times2=1.25(1)\),\(0.25\times2=0.5(0)\),\(0.5\times2=1.0(1)\) → \(0.101\)。故 \(20.625=10100.101_2\);分组 \(0001\,0100.1010\) = 14.AH。核对 \(16+4+0.625=20.625\) ✓。

自测 4(选择 · ★★★ 高频考点)

信息位为 8 位、要纠正 1 位错的海明码,至少需要校验位( )
A. 3 位 B. 4 位 C. 5 位 D. 6 位

查看答案

B。\(2^k\ge8+k+1\):\(k=3\) 时 \(8\lt12\);\(k=4\) 时 \(16\ge13\) ✓ → 4 位,码字共 12 位。纠 1 位错要求码距 ≥ 3;若还要「纠一检二」再加 1 位全校验位(码距 4)。

自测 5(计算 · ★★★★)

信息码 M = 110,生成多项式 \(G(x)=x^{3}+1\)。求 CRC 码字并验证。

查看答案

\(G\) 对应 1001,余数 3 位;M 左移 3 位:110 000。模 2 除:

① 取前 4 位 1100,首位 1 → 商 1:\(1100\oplus1001=0101\);
② 落下 0 → 1010,首位 1 → 商 1:\(1010\oplus1001=0011\);
③ 落下 0 → 0110,首位 0 → 商 0,原样保留。

余数 R = 110,CRC 码字 = 110 110 = 110110。验证:接收端 110110 ÷ 1001 → \(1101\oplus1001=0100\),落 1 → 1001,\(1001\oplus1001=0000\),落 0 → 0000 → 余数 000 ✓。

自测 6(解答 · ★★★ 高频考点)

用 8 位补码计算 (−100)+(−90),分别用一位符号位法与双符号位法判断是否溢出。

查看答案

[−100]补 = 1001 1100(−128+28 ✓),[−90]补 = 1010 0110(−128+38 ✓)。相加:\(1001\,1100+1010\,0110=1\,0100\,0010\),丢弃进位得 0100 0010(= +66)。

一位符号位法:两操作数同为负,结果符号为 0(正)——同号相加结果变号 → 溢出(负溢);进位法:数值最高位进位 0 ⊕ 符号位进位 1 = 1,同样判溢。

双符号位法:\(11\,0011100+11\,0100110=1\,10\,1000010\xrightarrow{\text{丢进位}}10\,1000010\),双符号位 10 → 负溢 ✓(真实和 −190 < −128)。

自测 7(计算 · ★★★★)

将 −1.5 转换为 IEEE 754 单精度格式(十六进制表示)。

查看答案

S = 1;\(1.5=1.1_2=1.1\times2^{0}\) → E = 0+127 = 127 = 0111 1111;M = 100 0000 0000 0000 0000 0000(23 位)。

拼接:1 | 0111 1111 | 1000…0 → 1011 1111 1100 0000 … = 0xBFC00000。核对:E = 127 → 指数 0,\(1.M=1.1_2=1.5\),添负号 ✓。

自测 8(选择 · ★★★)

浮点加减运算对阶的原则是( )
A. 大阶向小阶对齐,尾数左移 B. 小阶向大阶对齐,尾数右移 C. 阶码小者尾数左移 D. 任一方对齐均可

查看答案

B。小阶尾数右移丢失的是低位(影响小),大阶尾数若左移会丢失高位有效数字(错误不可接受)。对阶时阶差每差 1,小阶尾数右移 1 位、阶码 +1,直到阶相等。

自测 9(填空 · ★★★)

设 8 位 [x]补 = 1011 0000:x = \(\underline{\hspace{1cm}}\);x 算术右移 1 位后的真值 = \(\underline{\hspace{1cm}}\);若误用逻辑右移,得到的错误结果 = \(\underline{\hspace{1cm}}\)。

查看答案

x = \(-128+32+16=\)−80。算术右移 1 位 → 1101 1000 = \(-128+64+16+8=\)−40(= −80÷2 ✓,高位补符号 1)。误用逻辑右移 → 0101 1000 = +88(高位补 0,符号被洗掉),数值完全错误。

自测 10(解答 · ★★★★ 冲刺)

浮点数字长同例 12(阶码 3 位补码、尾数双符号 + 4 数值位)。设 \(x=2^{01_{2}}\times0.1001\),\(y=2^{00_{2}}\times0.0100\),按五步法求 x−y。

查看解答

① 对阶:阶差 1,y 阶小 → 尾数右移 1 位:\(0.0100\to0.0010\)(移出 0),y = \(2^{01_{2}}\times0.0010\)。

② 尾数相减:\(00.1001+[−0.0010]_{补}=00.1001+11.1110=100.0111\to00.0111\)(双符号吸收进位)。

③ 规格化:0.0111 最高数值位为 0,非规格化 → 左规:左移 1 位得 0.1110,阶码 −1 → \(2^{00_{2}}\)。

④ 舍入:左规不丢失位,无舍入;⑤ 判溢出:阶码 000 正常 → 无溢出。

结果 \(x-y=2^{00_{2}}\times0.1110=0.875\)。核对:\(x=0.5625\times2=1.125\),\(y=0.25\),\(1.125-0.25=0.875\) ✓。(本题串联了减法化加、左规两大易漏点。)

2.7 本章考点总结

考点常考题型热度核心方法
进制转换与 BCD选择 / 填空★★★除基取余、乘基取整;3 / 4 位分组互转;0.3 型小数无限循环;BCD 加法 ">9 或进位则 +6"
海明码选择 / 解答★★★★\(2^k\ge n+k+1\) 定校验位数(4 位信息 k=3、8 位信息 k=4);校验位放 2 的幂位;\(S\) 拼位号即出错位
CRC 循环码解答★★★★补 \(r\) 个 0 → 模 2 除(逐位异或)→ 余数拼接;接收端余 0 判对;只检不纠
机器码与 [-x]补选择★★★★负数补码 = 反码 + 1;[−x]补 连同符号位取反加 1;[−128]补 = 1000 0000 特例
补码加减与溢出选择 / 解答★★★★★ 每年必考模回绕丢进位;同号相加才可能溢出;双符号位 01 正溢 / 10 负溢;\(C_s\oplus C_1\)
移位运算选择★★★算术右移补符号位(负数补 1);逻辑右移补 0;左移 ×2 可能溢出
乘除法解答★★★★原码乘:符号异或、绝对值部分积右移;Booth:01 加 [x]补、10 加 [−x]补,最后一步不移;加减交替:余数正负定上商
IEEE 754选择 / 解答★★★★★ 每年必考1+8+23 偏置 127(双精度 1+11+52 偏置 1023);隐藏位 1.;E 全 0 / 全 1 的特殊值
浮点加减五步解答★★★★对阶小阶右移 → 双符号尾数加减 → 左规 / 右规 → 0 舍 1 入 → 阶码溢出才是真溢出
下一步本章过关标准:12 道例题全部独立重做、每个二进制结果都能十进制核对;自测 10 题至少 8 题正确;能默写 8 位四种机器码范围表、IEEE 754 三段式与五步口诀。本章的补码与溢出概念将在指令执行与运算器设计中反复出现,随后进入 第 3 章 存储器层次结构——组成原理大题的第二主战场(Cache 与虚存每年必考一道大题)。