第 2 章 数据的表示和运算
本章地位:组成原理中计算题最密集的一章,也是选择题的「弹药库」:IEEE 754 转换、补码溢出判断、海明码分组、CRC 模 2 除法几乎每年都在卷面上出现。真题套路高度固定——按步骤逐位演算、结果自检即可拿满分;失分几乎都失在「跳步」上。本章每道例题都把每一步展开到二进制位,并附数值核对,请务必跟着动笔算一遍。
2.1 进位计数制与编码
2.1.1 r 进制及其互相转换
二进制 ↔ 八 / 十六进制:分组法——整数从小数点向左、小数向右,每 3 位(八进制)或 4 位(十六进制)一组,不足补 0。
(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 码计算 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;修正若再产生进位,进位正是给上一位十进制数的。
将十进制数 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 码距与奇偶校验
2.2.2 海明码:分组 + 纠错
② 第 \(i\) 个校验位校验「位号的二进制展开中第 \(i\) 位为 1」的所有位(按偶校验配置);
③ 纠错时算出各组的校验方程 \(S_i\),\(S_k\cdots S_2S_1\) 拼成的二进制数就是出错位的位号,将该位取反即纠错;全 0 表示无错。
设信息位 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)
信息码 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 → 判错请求重传(余数与出错位一一对应,但一般不用于纠错)。
(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 原码 / 反码 / 补码 / 移码
- 原码:符号位 + 绝对值。0 有两个(+0 = 0000 0000,−0 = 1000 0000);
- 反码:正数同原码;负数 = 原码数值位按位取反。0 也有两个;
- 补码:正数同原码;负数 = 反码末位 + 1。0 唯一;多表示一个负数 −128;加减法统一为加法;
- 移码:真值 + 偏置(8 位偏置 2⁷ = 128),即补码的符号位取反。常用于表示浮点阶码,直接按无符号数比较大小;0 唯一。
| 码制(8 位) | 表示范围 | 0 的个数 | 特殊值 |
|---|---|---|---|
| 原码 | −127 ~ +127 | 2 个 | −0 = 1000 0000 |
| 反码 | −127 ~ +127 | 2 个 | −0 = 1111 1111 |
| 补码 | −128 ~ +127 | 1 个 | [−128]补 = 1000 0000(无对应原码) |
| 移码 | −128 ~ +127 | 1 个 | [−128]移 = 0000 0000,[0]移 = 1000 0000 |
设 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 补码加减法与溢出判断
用 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)。两异号数相加必不溢出,此处只是自然回绕。
- 一位符号位(操作数法):两同号操作数之和的符号与之相反 → 溢出;
- 进位法:符号位进位 \(C_s\) 与最高数值位进位 \(C_1\) 异或为 1 → 溢出;
- 双符号位(变形补码):00 正、11 负;结果符号 01 → 正溢,10 → 负溢。最高符号位永远代表真正符号。
用变形补码(双符号位)计算 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;
}
已知 [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 | 无符号数 / 位串的平移 |
设 [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 乘法
设 x = −0.101,y = 0.011,用原码一位乘法求 x·y。
查看解答
数值部分 |x| = 0.101(记 101),|y| = 0.011(乘数寄存器 R 初值 011);部分积 P 初值 000。
| 步骤 | 判断位(R 末位) | 操作 | 部分积 P | 乘数 R |
|---|---|---|---|---|
| 初态 | — | — | 000 | 011 |
| 1 | 1 | P+101 = 101,右移 | 010 | 101 |
| 2 | 1 | P+101 = 111,右移 | 011 | 110 |
| 3 | 0 | P+000 = 011,右移 | 001 | 111 |
数值积 = 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}\) ✓。
| 判断位 \(y_i\,y_{i+1}\) | 操作 |
|---|---|
| 0 0 或 1 1 | 部分积 + 0,右移一位 |
| 0 1 | 部分积 + [x]补,右移一位 |
| 1 0 | 部分积 + [−x]补,右移一位 |
设 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 |
| 1 | y₃y₄ = 10 | +11.011 = 11.011,算术右移 | 11.101 |
| 2 | y₂y₃ = 11 | +0,算术右移 | 11.110 |
| 3 | y₁y₂ = 01 | +00.101 → 100.011 = 00.011,算术右移 | 00.001 |
| 4 | y₀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 除法:原码加减交替法
设 x = 0.011,y = 0.100,用原码加减交替法求 x/y(写出逐步过程)。
查看答案
|x| = 0.011,|y| = 0.100,[−|y|]补 = 1.100。余数寄存器 R 初值 = |x| = 0.011,第一步先试减:
| 步骤 | 操作 | 余数 R | 商 |
|---|---|---|---|
| 1 | R−|y|:0.011+1.100 = 1.111 < 0 | 1.111(=−0.001) | 0 |
| 2 | 左移 → 11.110;R+|y|:11.110+00.100 = 100.010 → 00.010 ≥ 0 | 00.010(=+0.010) | 1 |
| 3 | 左移 → 00.100;R−|y|:00.100+11.100 = 100.000 → 00.000 ≥ 0 | 00.000 | 1 |
商 = 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 浮点表示与运算 高频考点
2.5.1 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\),添负号 ✓。
将单精度数 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 位分组写十六进制。
2.5.2 浮点加减运算五步法
② 尾数加减(用双符号位补码);
③ 规格化:尾数溢出(符号 01/10)或出现非规格化形式 → 右规(尾数右移 1 位、阶码 +1)/ 左规(尾数左移 1 位、阶码 −1);
④ 舍入:右移丢失位按 0 舍 1 入(丢 1 则末位 +1)或恒置 1 / 截断处理;
⑤ 判溢出:阶码上溢才是真溢出(中断 / 置无穷),尾数"溢出"可被右规修复,阶码下溢一般按机器零处理。
设浮点数字长:阶码 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³⁸ 量级) |
| 精度 | 全范围等精度 | 相对精度恒定,绝对精度随阶码浮动 |
| 运算速度 | 快(直接加减) | 慢(对阶、规格化、舍入多步) |
| 溢出判断 | 结果超范围即溢出 | 仅阶码溢出才是溢出,尾数溢出可右规挽救 |
将 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 分钟,先动笔逐位演算再对答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。所有结果都要像正文一样用十进制核对一遍。
8 位补码 1000 0000 表示的十进制数是( )
A. 0 B. −0 C. −128 D. −127
查看答案
C。补码 1000 0000 是特例:符号位 1、数值位全 0,真值 \(=-2^{7}=-128\),它没有对应的原码 / 反码。补码正是靠这个特例比原码多表示一个负数(−128~127 共 256 个数)。
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 是原码取反(反码)。
将十进制数 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\) ✓。
信息位为 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)。
信息码 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 ✓。
用 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)。
将 −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\),添负号 ✓。
浮点加减运算对阶的原则是( )
A. 大阶向小阶对齐,尾数左移 B. 小阶向大阶对齐,尾数右移 C. 阶码小者尾数左移 D. 任一方对齐均可
查看答案
B。小阶尾数右移丢失的是低位(影响小),大阶尾数若左移会丢失高位有效数字(错误不可接受)。对阶时阶差每差 1,小阶尾数右移 1 位、阶码 +1,直到阶相等。
设 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,符号被洗掉),数值完全错误。
浮点数字长同例 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 入 → 阶码溢出才是真溢出 |