第 2 章 数据的表示和运算¶
依据:袁春风《计算机组成原理》(2016 年版)第 2 章及配套自考大纲。下文编号指大纲“考核内容与考核要求”;教材算例为学习辅助,不是真题。
复习导航:大纲要求与笔记位置¶
| 大纲条目 | 层次 | 位置 | 学完应能做到 |
|---|---|---|---|
| 1 数制和编码 | 领会、简单应用 | 第 1 节 | 说明真值与机器数的关系,完成进位制转换与原反补移码转换 |
| 2 整数的表示 | 领会、简单应用 | 第 2 节 | 解释补码被采用的原因,处理扩宽、截断与类型转换 |
| 3 实数的表示 | 领会、简单应用 | 第 3 节 | 说明格式与精度范围的关系,在真值与单精度间转换 |
| 4 非数值数据的编码 | 领会 | 第 4 节 | 说明逻辑值、ASCII、GB 2312 的表示方法 |
| 5 数据的宽度和存储 | 领会、简单应用 | 第 5 节 | 区分容量单位,按大端小端与对齐规则计算变量地址和大小 |
| 6 数据校验码 | 领会、简单应用 | 第 6 节 | 说明奇偶、海明、CRC 的基本思想,计算给定数串的校验位 |
| 7 加法器和 ALU | 识记、领会、简单应用 | 第 7 节 | 解释带标志加法器的结构,对给定运算说明结果与标志 |
| 8 定点乘法运算 | 领会、简单应用 | 第 8 节 | 说明无符号与原码、补码乘的原理,算出乘积机器数与真值 |
| 9 定点除法运算 | 领会 | 第 9 节 | 说明恢复余数法与加减交替法的思路 |
| 10 浮点数运算 | 领会、简单应用 | 第 10 节 | 对给定浮点数完成加减运算,说明附加位与舍入模式 |
第 9 条在所用大纲 OCR 稿中缺少细分说明,此处依教材保留。本章多数条目兼有领会与简单应用,需要结合具体数据计算;仅第 4 条为纯领会。
本章学习目标¶
这一章分两半:前半讲数据怎样编码和存储,后半讲运算部件怎样处理这些编码。
数制转换、补码、IEEE 754、端序与对齐、校验码、加减运算及标志判断,需要结合数据练习;乘除法则应先理解算法流程与各寄存器的变化。每次计算前,先写明位宽和数据类型,避免对同一位串作出错误解释。
1 数制和编码(1,领会、简单应用)¶
任何 \(r\) 进制数都按位权展开:以小数点左边第一位(个位)为第 0 位,往左第 \(i\) 位的位权是 \(r^i\),小数点往右依次是 \(r^{-1}, r^{-2}, \dots\),把每位数字乘上对应位权再加总,就是这个数的数值。
十进制转二进制时,整数部分反复除以 2,余数从后往前排列;小数部分反复乘以 2,依次取整数位,从前往后排列。某些小数无法有限表示,例如 \(0.1_{10}\),只能按给定位宽截断或舍入,这也是浮点误差的来源之一。二进制与八进制、十六进制互转时,以小数点为界,每 3 位或 4 位分组,不足处补 0。例如,\((45.625)_{10} = (101101.101)_2 = (2\text{D.A})_{16}\)。
带正负号的实际数值称为真值,在寄存器或内存中的二进制编码称为机器数。设机器字长为 \(n\) 位(含最高位 1 位符号位),四种定点编码对比如下:
| 编码 | 正数 | 负数 | 整数范围与零 |
|---|---|---|---|
| 原码 | 符号 0+绝对值 | 符号 1+绝对值 | \(\pm(2^{n-1}-1)\),有 \(+0\) 和 \(-0\) 两种编码 |
| 反码 | 同原码 | 符号位 1 不动,数值位逐位取反 | 同原码,同样有 \(\pm 0\) |
| 补码 | 同原码 | 正数编码逐位取反末位加 1(或反码加 1) | \(-2^{n-1} \sim 2^{n-1}-1\),0 的编码唯一,负数端多出一个 \(-2^{n-1}\) |
| 移码 | 真值加上固定偏置常数后按无符号编码 | 同一规则 | 专门方便阶码直接比大小;标准偏置取 \(2^{n-1}\),而 IEEE 754 单精度阶码偏置取 \(2^{8-1}-1=127\) |
8 位字长下,\(-5\) 的原码为 1000 0101,反码为 1111 1010,补码为 1111 1011。求补码真值时,最高位的位权为 \(-2^{n-1}\),其余位权为正,因此可算得 \(-128 + (64+32+16+8+2+1) = -128 + 123 = -5\)。若移码偏置取 \(2^{n-1}\),它与同字长补码只差最高位取反;IEEE 754 的阶码则需按偏置 127 或 1023 计算,不能直接套用这一转换。
2 整数的表示(2,领会、简单应用)¶
同一 \(n\) 位二进制串,按无符号整数解释时,范围为 \(0 \sim 2^n - 1\);按带符号补码整数解释时,范围为 \(-2^{n-1} \sim 2^{n-1} - 1\)。补码运算利用模 \(2^n\) 的性质,将减法 \(X - Y\) 转换为加上 \([-Y]_{\text{补}}\)。符号位与数值位一同参与加法,超出 \(n\) 位的进位丢弃,因此加减运算可共用加法器。
整数在不同位宽的寄存器或变量之间转换时,先判断属于以下哪种情况:
- 位数扩宽(扩展):无符号数往高位一律补 0(零扩展);补码带符号数往高位一律复制原来的符号位(符号扩展),比如 8 位补码 \(-5\)(
1111 1011)扩成 16 位就是1111 1111 1111 1011(FFFBH),真值丝毫不变。 - 位数截断:缩小位宽时通常只保留低位,原数值可能改变;需结合目标类型重新解释结果。
- 同位宽下的类型解释:按本章的补码模型,8 位
FFH解释为带符号数时是 \(-1\),解释为无符号数时是 \(255\),位串相同而数值含义不同。分析 C 语言的有符号、无符号混合表达式时,还需按类型的位宽和转换规则确定最终类型,不能一概认为都按有符号数比较。第 12 节第 8、9 题可用于练习这一点。
3 实数与 IEEE 754(3,领会、简单应用)¶
定点表示的小数点位置固定,给定位宽下的范围有限。浮点表示将数值分为符号、尾数和阶码,以“符号 × 尾数 × 基数的阶次”表示,可在相同位数下覆盖更大的范围。
阶码位数主要决定范围,尾数有效位数主要决定精度。在总位宽固定时,两者需要权衡。二进制正规数通常写为 ±1.f×2ᵉ,首位 1 可隐含存储,不占尾数字段。
| 格式 | 符号 s | 阶码 E | 小数部分 F | 偏置 |
|---|---|---|---|---|
| 单精度 32 位 | 1 位 | 8 位 | 23 位 | 127 |
| 双精度 64 位 | 1 位 | 11 位 | 52 位 | 1023 |
单精度正规数:值=(−1)ˢ×(1.F)₂×2^(E−127),1≤E≤254,隐藏的首位 1 使有效精度为 24 位。
| 单精度阶码/尾数字段 | 含义 |
|---|---|
| E=0,F=0 | ±0 |
| E=0,F≠0 | 非规格化数,值=(−1)ˢ×0.F×2⁻¹²⁶ |
| 1≤E≤254 | 正规数 |
| E=255,F=0 | ±∞ |
| E=255,F≠0 | NaN |
最小正正规数为 2⁻¹²⁶,最小正非规格化数为 2⁻¹⁴⁹,最大有限正数为 (2−2⁻²³)×2¹²⁷。无穷大与 NaN 需分开:溢出等情况可能得到无穷大,0/0、∞−∞ 等无效运算则产生 NaN。两者阶码均为全 1,通过尾数字段是否为 0 区分。
编码算例:−13.25=−1101.01₂=−1.10101₂×2³,因此 s=1,E=130=10000010₂,F=10101000000000000000000,编码为 C1540000H。解码时先检查阶码是否为 0 或 255,区分特殊值和非规格化数,再对正规数使用偏置 127 的公式。E=0 时不能补隐藏的首位 1。
解码算例(自编,题型同 202410 计算 26):把 C0B00000H 还原成真值,按评分的三步写。
第一步,展开并切字段(2 分)。C0B00000H = 1100 0000 1011 0000 0000 0000 0000 0000B,按 1+8+23 切成 s=1、E=1000 0001、F=011 0000 0000 0000 0000 0000。
第二步,先判特殊值再读字段(2 分)。E=1000 0001B=129,既不是 0 也不是 255,属正规数,隐藏位 1 要补上;F=0.011B=0.375。
第三步,套偏置求真值(2 分)。值 \(=(-1)^{1}\times(1+0.375)\times2^{129-127}=-1.375\times4=-5.5\)。
顺序别颠倒:先判 E 是不是 0 或 255,再决定补不补隐藏位、套哪个偏置。E=0 走非规格化公式,E=255 直接落到 ±∞ 或 NaN,两者都不再减偏置。
整数转浮点可能丢精度,浮点转整数可能截掉小数,也可能越界。单精度能精确表示所有绝对值不超过 2²⁴ 的整数,但表示不了全部 32 位整数——24 位有效位装不下 31 位有效位。
4 非数值数据(4,领会)¶
逻辑值和字符也需编码为二进制。逻辑数据可按位进行与、或、非、异或运算。7 位标准 ASCII 码可表示 \(2^7 = 128\) 个字符,通常占 1 字节,最高位填 0 或另作校验。常用基准为:数字字符 '0' 对应 30H(48),'A' 对应 41H(65),'a' 对应 61H(97),同组字符可依次推算。字符 '0' 的编码与数值 0 的全零编码不同。
单字节无法容纳大量汉字,教材介绍的 GB 2312 国标汉字编码采用双字节,并区分以下三种码及其转换关系:
这两步用于区分编码范围:区位码各加 20H 得到国标码,避开 ASCII 控制字符;再将两字节最高位各置 1(各加 80H,合计相当于各加 A0H),得到教材所述的汉字机内码。计算时,若区位码以十进制给出,如“28 区 42 位”,应先分别转为十六进制,再加 20H 和 80H。拼音、五笔等属于输入码,点阵或矢量轮廓用于显示、打印,属于字模码(输出码),两者与内部存储交换使用的机内码作用不同。
5 数据宽度、端序和对齐(5,领会、简单应用)¶
1 B = 8 bit。教材计算容量时常按 1 KB = 2¹⁰ B、1 MB = 2²⁰ B;题目若采用十进制单位,应按题意处理。数据字长、地址宽度、指令长度互不等同。
32 位 12345678H 从地址 1000H 开始存放:
| 地址 | 大端 | 小端 |
|---|---|---|
| 1000H | 12 | 78 |
| 1001H | 34 | 56 |
| 1002H | 56 | 34 |
| 1003H | 78 | 12 |
端序规定多字节对象的字节顺序。对齐则规定对象的起始地址必须是某个数的倍数,为此会在结构体里插入填充。例如按 char 对齐 1、int 对齐 4、结构整体对齐 4:char a; int b; char c; 的偏移为 0、4、8,整体占 12 字节。不同 ABI 的规则可能不同,计算前先写明假设。
对齐有助于满足指令的访存要求,并减少跨边界访问。按常见的 64 B Cache 行举例:4 字节数据从行内偏移 4 开始,全部位于同一行;从偏移 62 开始,则横跨两行,硬件可能需要分两次访问并合并结果。未按 4 字节对齐的数据也可能完全落在同一行中。额外耗时取决于处理器、指令、Cache 命中情况及是否跨页,不能一律算成延迟翻倍。
各架构的处理方式也不同。x86 的许多普通访存指令支持未对齐地址,但部分指令仍有对齐要求。带 lock 前缀的原子操作若跨 Cache 行,会形成 Split Lock,可能引起总线锁定或检测异常,代价远高于普通未对齐访问。经典 MIPS、启用严格对齐检查的 ARM 等可能触发对齐异常;操作系统再按平台与配置选择软件模拟或向进程报告错误,不能统一断言都会得到 SIGBUS。
按上面的 ABI 假设,char a; int b; char c; 中 a 后填 3 字节、c 后再填 3 字节,共占 12 字节。前一处填充让 b 按 4 字节对齐,尾部填充让结构体数组中的下一项也满足整体对齐要求。
6 数据校验码(6,领会、简单应用)¶
偶校验要求整个码字(含校验位)中 1 的个数为偶数,奇校验则要求为奇数。1011001 有 4 个 1,因此偶校验位取 0,奇校验位取 1。单个奇偶校验位能检测奇数个位翻转,但无法定位或纠错,也不能检测偶数个位翻转。
海明码用多个校验组交叉覆盖数据,校验位通常位于 1、2、4、8 等 2 的幂位置。综合各组校验结果,可定位单比特错误,其位置编号由相应校验位编号组合得到。k 位数据配置 r 位校验位时,单错定位通常要求 2ʳ≥k+r+1;再加一个总体奇偶校验位,可实现单错纠正、双错检测。
CRC 将位串视为 GF(2) 上的多项式,用模 2 除法求余数。r 次生成多项式对应 r 位校验码:数据后补 r 个 0,除以生成多项式,将 r 位余数接到原数据后。接收端再次相除,余数为 0 表示未检出错误,并不保证绝无错误。模 2 减法等同异或,不借位;检错能力取决于生成多项式,不能笼统说 CRC 能纠错。
7 加法器和 ALU(7,识记、领会、简单应用)¶
半加器满足 S=A⊕B、C=AB。全加器还接收低位进位 Cin,满足 S=A⊕B⊕Cin、Cout=AB+(A⊕B)Cin。串行进位结构简单,但进位逐级传递,位数增加时延迟增大;先行进位通过产生、传递逻辑提前计算,以电路面积换取速度。ALU 则按控制信号选择加减、逻辑和移位等操作。
补码减法可以换成加上减数的相反数,加减运算于是能共用同一套加法器。关系式为 F=X+(Y⊕Sub)+Sub,其中 Y 的每一位都要跟控制位 Sub 异或。Sub=0 时 Y 原样通过,执行 X+Y;Sub=1 时 Y 逐位取反再加 1,执行 X−Y。结果截到指定位数之后,还得靠状态标志判断溢出、进位这些事。
| 标志 | 本教材口径 |
|---|---|
| ZF | 结果全零则 1 |
| SF | 结果最高位 |
| OF | 有符号溢出,等于进入符号位和离开符号位的进位异或 |
| CF | 无符号进/借位;加法为 Cout,减法为 ¬Cout,即 Sub⊕Cout |
加法的判断口诀:同号相加而结果异号,OF=1。减法的判断口诀:两操作数异号,且结果符号与被减数不同,OF=1。不同架构对减法进位标志的命名可能不一样,答题时以题目给出的定义为准。
8 位 7FH+01H=80H:SF=1、ZF=0、OF=1、CF=0。带符号的 127+1 已经越界,无符号的 128 却完全正确——同一串位,两种解释。FFH+01H=00H:CF=1、ZF=1、OF=0。00H−01H=FFH:借位 CF=1、OF=0。
逻辑右移在高位补 0,补码算术右移则复制符号位。左移一位只有在结果可表示时,才对应数学上的乘 2;负奇数的算术右移也不等于向零截断的除以 2。例如,8 位补码 \(-3\) 算术右移一位得到 \(-2\),而向零截断的 \(-3/2\) 为 \(-1\)。判断时应同时检查位串与舍入规则。
8 定点乘法(8,领会、简单应用)¶
无符号乘法按乘数的每一位决定要不要累加移位后的被乘数,本质是部分积相加。n 位×n 位通常保留 2n 位积。原码乘法先异或符号位,再算绝对值乘积。
例:0101₂×0011₂=00000101+00001010=00001111₂。若是 −5×3,真值为 −15,8 位补码积为 11110001。
补码乘法用 Booth 思想对付连续的 1。在乘数低端补一个 0,每步看 (Q₀,Q₋₁):01 加被乘数,10 减被乘数,00 或 11 什么都不做,然后把部分积与乘数合起来算术右移,重复指定位数。
定点乘法需注意两点:运算中保持正确的符号扩展,极值情况可能需要额外扩展位;补码乘法不能直接套用无符号乘法并期待结果相同。第 12 节习题 17 对比了两种解释下的运算。
9 定点除法(9,领会)¶
除法通过比较、减法和移位逐位求商:根据当前余数与除数的关系确定商位,再移位继续计算。硬件常用减法结果的符号判断是否够减,而不单独实现一次完整的大小比较。
9.1 恢复余数法¶
恢复余数法先用当前余数减去除数。若差非负,当前商位取 1,并保留差;若差为负,商位取 0,再把除数加回以恢复原余数。随后左移并处理下一商位。算法名称中的“恢复”,指的就是这一步加回操作。
恢复余数会增加加法次数,最坏情况下每个商位都需恢复一次,n 位除法可涉及约 2n 次加减;实际周期数还取决于具体硬件实现。
9.2 加减交替法¶
加减交替法在余数为负时不立即恢复。下一步左移后改为加上除数,抵消上一步多减的部分。
若上一步余数 R < 0,恢复余数法的后续计算为“先加回 y,再左移,再减 y”,即 2(R+y) − y = 2R + y。加减交替法直接计算 2R + y,在这一负余数分支中省去一次恢复加法。
加减运算由上一步余数的符号决定,并非固定轮换:余数非负时,下一步左移后减除数;余数为负时,下一步左移后加除数。新余数非负,商位取 1;新余数为负,商位取 0。
最后一步的余数仍可能为负数。若为负,需加回除数后才能得到真余数;否则直接报告的余数符号会错误。
9.3 四步口诀¶
(1)符号位单独处理。商的符号 = 被除数符号 ⊕ 除数符号,数值部分一律取绝对值参加运算,符号不跟着移位。
(2)被除数减除数,试商。够减商 1,不够减商 0。
(3)余数非负,商 1,左移后减除数;余数为负,商 0,左移后加除数。根据余数符号选择加减,而不是无条件交替。
(4)末步余数为负,加除数恢复,否则余数不能直接用。
补一句前提:定点小数除法要求 |被除数| < |除数|,否则商会带出整数部分,超出定点小数的表示范围。整数除法没有这个限制。
9.4 逐步追踪(自编例,非教材原题)¶
自编例,不是教材原题:被除数为 0.1011,除数为 0.1101,商取 4 位。两数为正,商的符号位为 0;且 |x| < |y|(0.6875 < 0.8125),满足本例定点小数除法的前提。
先用加减交替法走一遍。商寄存器每一步先左移一位,再把这一位的商填到最低位。
| 步 | 操作 | 部分余数 | 商寄存器 |
|---|---|---|---|
| 初始 | R₀ = x | 0.1011 | 0.0000 |
| 1 | 2R₀ − y = 1.0110 − 0.1101 | 0.1001,≥0 → q₁=1 | 0.0001 |
| 2 | 2R₁ − y = 1.0010 − 0.1101 | 0.0101,≥0 → q₂=1 | 0.0011 |
| 3 | 2R₂ − y = 0.1010 − 0.1101 | −0.0011,<0 → q₃=0 | 0.0110 |
| 4 | 2R₃ + y = −0.0110 + 0.1101 | 0.0111,≥0 → q₄=1 | 0.1101 |
第 4 步中,\(R_3\) 为负,因此本步改用加法。左移后计算 \(-0.0110 + y = 0.0111\),结果非负,所以 \(q_4=1\)。
得到 4 位商 \(0.1101\)。表中的余数 \(0.0111\) 已经过 4 次左移,因此要乘以 \(2^{-4}\) 还原权重。真余数为 \(0.0111 \times 2^{-4} = 0.0000\ 0111\)。
验算。商 0.1101 = 13/16 = 0.8125,真余数 0.0111 × 2⁻⁴ = 7/256 = 0.027 343 75。
其中 \(0.1101=13/16\),所以乘积 \(0.1101\times0.1101=169/256=0.1010\ 1001\)。加上余数 \(0.0000\ 0111\),结果为 \(0.1011\ 0000=0.1011\),与被除数相同,验算通过。
余数非零是因为商只保留 4 位。真实商 \(11/13 \approx 0.846\),大于 \(0.1101_2=0.8125\);两者的差由余数表示。这是有限位商的结果,不是计算错误。
9.5 恢复余数法对照¶
同一组数据改用恢复余数法再走一遍,对照着看。差别只出现在第 3 步之后:余数为负,先加回除数,再往下算。
| 步 | 操作 | 部分余数 | 商寄存器 |
|---|---|---|---|
| 初始 | R₀ = x | 0.1011 | 0.0000 |
| 1 | 2R₀ − y = 1.0110 − 0.1101 | 0.1001,≥0 → q₁=1 | 0.0001 |
| 2 | 2R₁ − y = 1.0010 − 0.1101 | 0.0101,≥0 → q₂=1 | 0.0011 |
| 3 | 2R₂ − y = 0.1010 − 0.1101 | −0.0011,<0 → q₃=0 | 0.0110 |
| 3′ | 恢复:R₃ + y = −0.0011 + 0.1101 | 0.1010 | 0.0110(不变) |
| 4 | 2R₃ − y = 1.0100 − 0.1101 | 0.0111,≥0 → q₄=1 | 0.1101 |
两种方法得到的商均为 0.1101,真余数均为 0.0111 × 2⁻⁴。本例恢复余数法多执行了第 3′ 步的加法;加减交替法将这一恢复操作合并到下一步。实际能节省多少操作,取决于负余数出现的次数和硬件实现,不能仅由位宽判断。
9.6 结果与边界¶
除法结果要满足“被除数 = 除数 × 商 + 余数”。例如 13 ÷ 3 的商为 4、余数为 1,因为 13 = 3 × 4 + 1。
带符号整数的商和余数符号,按题目规定的舍入方向定。C 语言的整数除法向零截断,商的符号取两数符号之积,余数的符号跟着被除数走。这与“余数总取正”的数学惯例并不一致,动笔前先看清题目用哪一套。
除数为 0 属于异常情况,硬件应给出除法错信号。n 位补码最小负数除以 −1 时,正商 2ⁿ⁻¹ 超出 n 位补码能表示的范围,同样按溢出处理。
定点小数除法还需考虑小数点位置与缩放。前两例已给定小数点位置;具体机器的寄存器组织和商位数则由指令规定。计算前应确认:是否满足 |x| < |y|、商取几位,以及如何还原余数的权重。
10 浮点数运算(10,领会、简单应用)¶
浮点加减的第一步不是加,是对阶。两数的小数点必须对齐才谈得上相加减,于是先比阶码,把阶码小的那个尾数右移,一直移到两数阶码相同,再让尾数相加。
运算结果可能需要重新规格化。尾数相加产生进位时,右移一位、阶码加一,称为右规;相减后有效位前移时,左移尾数并相应减小阶码,称为左规。随后舍入,若又产生进位则再次调整,最后检查阶码是否上溢、下溢或进入特殊值范围。
例:1.100₂×2²+1.000₂×2⁰=1.100₂×2²+0.010₂×2²=1.110₂×2²=7。对阶时先留着附加位,等最后统一舍入;中途过早截断,误差会一层层放大。
舍入常使用保护位 G、舍入位 R 和粘滞位 S,S 表示更低位中是否存在 1。四种舍入方向为:向最近(中点取偶)、向 0、向 +∞、向 −∞。最近取偶时,若丢弃部分恰好为半个末位单位,就检查保留结果的最低位:为 1 时进位,为 0 时不变,使结果末位为偶。
浮点乘法依次确定符号、相加真实阶码、相乘尾数,再规格化与舍入;除法则相减真实阶码、相除尾数。计算存储阶码时需修正偏置,不能直接将两个带偏置阶码相加后作为结果。浮点加法受舍入影响,不满足结合律,(a+b)+c 与 a+(b+c) 可能不同。
11 考核要求¶
本章共 10 条考核条目,除第 4 条(非数值数据)为纯领会外,其余要求结合数据完成简单应用或推导。重点练习补码与移码、IEEE 754 单精度编解码和加减、端序与结构体对齐、校验码计算,以及 OF、CF、ZF、SF 标志判断。定点乘除和浮点乘除侧重理解流程及寄存器变化,不必死记递推公式。
12 教材本章习题¶
题目取自教材第 2 章“习题”(共 19 题),答案取自教材附录“部分习题解答”(附录收录第 4、5、7、8、9、10、11、12、13、15、16、17、18 题,其余题目请对照教材自行完成)。
12.1 概念与简答¶
1. 给出以下概念的解释说明。
真值 机器数 数值数据 非数值数据 无符号整数 带符号整数
定点数 浮点数 尾数 阶和阶码 溢出 规格化数
左规 右规 ASCII 码 汉字输入码 汉字内码 字长
大端方式 小端方式 算术逻辑部件 ALU
答案与解析
教材附录未收本题解答,请对照教材自行完成。
2. 简单回答下列问题。
(1)为什么计算机内部采用二进制表示信息?
(2)既然计算机内部所有信息都用二进制表示,为什么还要用到十六进制或八进制数?
(3)在浮点数的基数和总位数一定的情况下,浮点数的表示范围和精度分别由什么决定?
(4)为什么要对浮点数进行规格化?有哪两种规格化操作?
(5)为什么计算机处理汉字时会涉及不同的编码(如输入码、内码、字模码)?说明这些编码中哪些用二进制编码,哪些不用二进制编码,为什么?
答案与解析
教材附录未收本题解答,请对照教材自行完成。
12.2 数制与机器数¶
3. 实现下列各数的转换。
(1)\((25.8125)_{10} = ( ? )_2 = ( ? )_8 = ( ? )_{16}\)
(3)\((4E.C)_{16} = ( ? )_{10} = ( ? )_{2}\)
答案与解析
教材附录未收本题解答,请对照教材自行完成。
4. 假定机器数为 8 位(1 位符号,7 位数值),写出下列各二进制数的原码表示。
答案与解析
参考答案: 题中各二进制数的原码表示在题下表中给出。
| 数值 | 原码 |
|---|---|
| +0.1001 | 0.1001000 |
| -0.1001 | 1.1001000 |
| +1.0 | 溢出 |
| -1.0 | 溢出 |
| +0.010100 | 0.0101000 |
| -0.010100 | 1.0101000 |
| +0.0 | 0.0000000 |
| -0.0 | 1.0000000 |
5. 假定机器数为 8 位(1 位符号,7 位数值),写出下列各二进制数的补码和移码表示。
答案与解析
参考答案: 题中各二进制数的补码和移码表示在下表中给出。
| 数值 | 补码 | 移码(偏置常数=1 0000000) | 移码(偏置常数=0 1111111) |
|---|---|---|---|
| +1001 | 0 0001001 | 1 0001001 | 1 0001000 |
| -1001 | 1 1110111 | 0 1110111 | 0 1110110 |
| +1 | 0 0000001 | 1 0000001 | 1 0000000 |
| -1 | 1 1111111 | 0 1111111 | 0 1111110 |
| +10100 | 0 0010100 | 1 0010100 | 1 0010011 |
| -10100 | 1 1101100 | 0 1101100 | 0 1101011 |
| +0 | 0 0000000 | 1 0000000 | 0 1111111 |
| -0 | 0 0000000 | 1 0000000 | 0 1111111 |
6. 已知 \([x]_{\text{补}}\),求 x。
(1)\([x]_{\text{补}} = 11100111\)。
(2)\([x]_{\text{补}} = 10000000\)。
(3)\([x]_{\text{补}} = 01010010\)。
(4)\([x]_{\text{补}} = 11010011\)。
答案与解析
教材附录未收本题解答,请对照教材自行完成。
12.3 整数与浮点表示¶
7. 假定一台 32 位字长的机器中带符号整数用补码表示,浮点数用 IEEE 754 标准表示,寄存器 R1 和 R2 的内容分别为 R1:00600000H, R2:80800000H。不同指令对寄存器进行不同的操作,因而,不同指令执行时寄存器内容对应的真值不同。假定执行下列运算指令时,操作数为寄存器 R1 和 R2 的内容,则 R1 和 R2 中操作数的真值分别为多少?
(1)无符号数加法指令。
(2)带符号整数乘法指令。
(3)单精度浮点数减法指令。
答案与解析
参考答案: (1)对于无符号数加法指令,R1 和 R2 的内容均被解释成无符号整数,即 R1 的真值为 \(600000H = 2^{22} + 2^{21}\),R2 的真值为 \(80800000H = 2^{31} + 2^{23}\)。(教材附录原文此处写作 \(2^{21}+2^{21}\),按位重算更正:600000H 的第 22、21 位为 1,两式相差 2 097 152。)
(2)对于带符号整数乘法指令,R1 和 R2 的内容均被解释为补码整数,由最高位可知,R1 为正数;R2 为负数。R1 的真值为 \(600000H = 2^{22} + 2^{21}\);R2 的真值为 -0111 1111 1000 0000 0000 0000 0000 0000B = \(-(2^{30} + 2^{29} + 2^{28} + 2^{27} + 2^{26} + 2^{25} + 2^{24} + 2^{23})\)。
(3)对于单精度浮点数减法指令,R1 和 R2 的内容均按 IEEE 754 单精度浮点数解读。先看 R1(0060 0000H):符号位为 0(正数),阶码 \(E = 0000\ 0000\text{B} = 0\),尾数小数部分 \(F = 110\ 0000\ 0000\ 0000\ 0000\ 0000\text{B} \ne 0\),属于非规格化浮点数,指数固定取 \(-126\)、不补隐藏位 1,真值为 \(+0.11\text{B} \times 2^{-126} = +0.75 \times 2^{-126}\)。再看 R2(8080 0000H):符号位为 1(负数),阶码 \(E = 0000\ 0001\text{B} = 1\),尾数 \(F = 0\),属于规格化浮点数,指数为 \(1 - 127 = -126\)、补上隐藏位 1 后尾数为 \(1.0\text{B}\),真值为 \(-1.0\text{B} \times 2^{-126} = -2^{-126}\)。(教材附录原文把 R1 符号误印或把规格化说明错位,此处按 IEEE 754 定义核准:R1 符号位为 0,真值必为正,规格化判断对应 R2。)
8. 假定机器 M 的字长为 32 位,用补码表示带符号整数。下表第一列给出了在机器 M 上执行的 C 语言程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写,并对其中的关系表达式“2147483647 < (int) 2147483648U”的结果进行说明。
| 关系表达式 | 运算类型 | 结果 | 说明 |
|---|---|---|---|
| 0 == 0U | |||
| -1 < 0 | |||
| -1 < 0U | 无符号整数 | 0 | 11...1B (2^32-1) > 00...0B(0) |
| 2147483647 > -2147483647 - 1 | 有符号整数 | 1 | 011...1B (2^31-1) > 100...0B (-2^31) |
| 2147483647U > -2147483647 - 1 | |||
| 2147483647 > (int) 2147483648U | |||
| -1 > -2 | |||
| (unsigned) -1 > -2 |
答案与解析
参考答案:
| 序号 | 关系表达式 | 运算类型 | 结果 | 说明 |
|---|---|---|---|---|
| 1 | 0 == 0U | 无符号整数 | 1 | 00...0B = 00...0B |
| 2 | -1 < 0 | 带符号整数 | 1 | 11...1B (-1) < 00...0B (0) |
| 3 | -1 < 0U | 无符号整数 | 0 | 11...1B ( \(2^{32}-1\)) > 00...0B (0) |
| 4 | 2147483647 > -2147483647 - 1 | 带符号整数 | 1 | 011...1B ( \(2^{31}-1\)) > 100...0B ( \(-2^{31}\)) |
| 5 | 2147483647U > -2147483647 - 1 | 无符号整数 | 0 | 011...1B ( \(2^{31}-1\)) < 100...0B ( \(2^{31}\)) |
| 6 | 2147483647 < (int)2147483648U | 带符号整数 | 0 | 011...1B ( \(2^{31}-1\)) > 100...0B ( \(-2^{31}\)) |
| 7 | -1 > -2 | 带符号整数 | 1 | 11...1B (-1) > 11...10B (-2) |
| 8 | (unsigned) -1 > -2 | 无符号整数 | 1 | 11...1B ( \(2^{32}-1\)) > 11...10B ( \(2^{32}-2\)) |
8 个关系表达式的运算结果依次为 1、1、0、1、0、0、1、1(1 表示“真”,0 表示“假”)。重点看第 6 项 2147483647 < (int) 2147483648U 为什么得 0(假):右边常数带着后缀 U,原本是无符号整数,机器数为 100…0B(最高位 1 后跟 31 个 0,真值 \(2^{31}\));一旦加上 (int) 强制转换成 32 位带符号补码整数,位串不变,真值却变成了最小负数 \(-2^{31} = -2\,147\,483\,648\)。左边是正数 \(2\,147\,483\,647\),自然不可能小于右边的负数 \(-2\,147\,483\,648\),关系不成立,结果为“假”。
9. 以下是一个 C 语言程序,用来计算一个数组 a 中每个元素的和。当参数 len 为 0 时,返回值应该是 0,但是在机器上执行时,却发生了存储器访问异常。请问这是什么原因造成的,并说明程序应该如何修改。
float sum_elements(float a[ ], unsigned len)
{
int i;
float result = 0;
for (i = 0; i <= len - 1; i++)
result += a[i];
return result;
}
答案与解析
参考答案: 存储器访问异常是数组 a 被越界或越权访问造成的。根源在循环条件的类型上:i 是 int,len 是 unsigned,两者一起比较时 int 会被转成无符号数,所以 i <= len - 1 整体按无符号整数规则判定。
关键在 len 为 0 这一路。len - 1 在无符号数里没有负数可退,0 减 1 直接下溢,绕回成 32 个 1——也就是 32 位无符号数能表示的最大值,4 294 967 295。这个数足够大,任何无符号整数都比它小。
于是 i <= len - 1 对每个 i 都为“真”。循环停不下来,i 一路加上去,a[i] 迟早踩出数组边界,越权或越界访问就此发生,最终报出存储器访问异常。
改法是把参数 len 声明为 int 型。这样 i <= len - 1 回到带符号比较:len 为 0 时 len - 1 得 −1,任何 i 都大于 −1,条件为“假”,循环一次都不进,直接返回 result = 0,正是题目要求的语义。
(补充建议,非教材原答案:更稳的写法是条件直接写 i < len。这样不必先算 len - 1,下溢的机会根本不存在;无符号数放在 < 里同样安全。)
10. 下列几种情况所能表示的数的范围是什么?
(1)16位无符号整数。
(2)16 位原码定点小数。
(3)16位补码定点整数。
(4)下述格式的浮点数(基数为2,移码的偏置常数为128,没有隐藏位)。
| 数符 | 阶码 | 尾数 |
|---|---|---|
| 1位 | 8位移码 | 7位原码数值部分 |
答案与解析
参考答案: (1)16 位无符号整数范围为 \(0 \sim 2^{16}-1\),即 \(0 \sim 65\,535\)。
(2)16 位原码定点小数表示的范围为 \(-\left(1-2^{-15}\right) \sim +\left(1-2^{-15}\right)\)。
(3)16 位补码定点整数表示的范围为 \(-2^{15} \sim +(2^{15}-1)\),即 \(-32\,768 \sim +32\,767\)。
(4)规格化浮点数的表示范围如下。最大正数:\(+0.111\ 1111\text{B} \times 2^{1111\ 1111\text{B}} = +(1-2^{-7}) \times 2^{127}\);最小正数:\(+0.100\ 0000\text{B} \times 2^{0000\ 0000\text{B}} = +2^{-1} \times 2^{-128} = +2^{-129}\);最大负数:\(-0.100\ 0000\text{B} \times 2^{0000\ 0000\text{B}} = -2^{-1} \times 2^{-128} = -2^{-129}\);最小负数:\(-0.111\ 1111\text{B} \times 2^{1111\ 1111\text{B}} = -(1-2^{-7}) \times 2^{127}\)。尾数用原码表示,正负区间关于原点严格对称。
对于非规格化浮点数,其最小正数和最大负数的尾数形式为 \(\pm0.000\ 0001\),最小正数和最大负数的值为 \(\pm2^{-7}\times2^{-128}=\pm2^{-135}\)。
11. 以 IEEE 754 单精度浮点数格式表示下列十进制数。
答案与解析
参考答案: 先算 \(+1.625 = +1.101\text{B} \times 2^{0}\):符号 \(s = 0\),阶码 \(E = 0 + 127 = 0111\ 1111\text{B}\),尾数小数部分 \(F = 101\ 0000\ 0000\ 0000\ 0000\ 0000\text{B}\),拼成 IEEE 754 单精度格式为
十六进制形式为 3FD0 0000H。再算 \(-9/16 = -0.1001\text{B} = -1.001\text{B} \times 2^{-1}\):符号 \(s = 1\),阶码 \(E = -1 + 127 = 0111\ 1110\text{B}\),尾数小数部分 \(F = 001\ 0000\ 0000\ 0000\ 0000\ 0000\text{B}\),拼成 IEEE 754 单精度格式为
十六进制形式为 BF10 0000H。
12. 设一个变量的值为 4098, 要求分别用 32 位补码整数和 IEEE 754 单精度浮点格式表示该变量(结果用十六进制表示), 并说明哪段二进制序列在两种表示中完全相同, 为什么会相同?
答案与解析
参考答案: \(4\,098 = 1\ 0000\ 0000\ 0010\text{B} = +1.0000\ 0000\ 001\text{B} \times 2^{12}\)。用 32 位补码整数表示为 0000 0000 0000 0000 0001 0000 0000 0010B,十六进制为 0000 1002H。用 IEEE 754 单精度浮点数格式表示时,符号 \(s=0\),阶码 \(E=12+127=139=1000\ 1001\text{B}\),尾数小数部分 \(F=0000\ 0000\ 0010\ 0000\ 0000\ 000\text{B}\),拼成 32 位二进制为
十六进制为 4480 1000H。两种表示都包含完全相同的 12 位二进制串 0000 0000 0010:32 位补码整数完整存下了有效位 1 0000 0000 0010,而规格化浮点数把最前面的最高有效位 1 作为隐藏位省掉了,紧跟在它后面的那 12 位 0000 0000 0010 原封不动落进了尾数字段的高 12 位。
13. 设一个变量的值为 -2 147 483 647,要求分别用 32 位补码整数和 IEEE 754 单精度浮点格式表示该变量(结果用十六进制表示),并说明哪种表示其值完全精确,哪种表示的是近似值。
答案与解析
参考答案: $$ \begin{aligned} -2\,147\,483\,647 &= -(2^{31}-1) = -111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\text{B}\quad(\text{共 31 个 1})\ &= -1.11\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 111\text{B} \times 2^{30} \end{aligned} $$
32 位补码形式为 1000 0000 0000 0000 0000 0000 0000 0001B(8000 0001H);IEEE 754 单精度格式在舍入前阶码为 \(30 + 127 = 157 = 1001\ 1101\text{B}\),31 位全 1 的有效数字只能留住 24 位,向最近舍入后尾数进位、阶码加 1 变为 \(158 = 1001\ 1110\text{B}\)、尾数全 0,即 1 1001 1110 0000 0000 0000 0000 0000 000B(CF00 0000H;教材附录未进位直接截断写作 1 100 1110 1 111 1111 1111 1111 1111 即 CEFF FFFFH)。由于 \(-2\,147\,483\,647\) 落在 \(-2^{31} \sim 2^{31}-1\) 范围内,32 位补码能完全精确表示;而 IEEE 754 单精度只有 24 位有效位(含隐藏位),装不下 31 位有效二进位,超出部分只能截断或舍入,因此是近似表示。
12.4 校验、端序与算术运算¶
14. 已知下列字符编码: A = 100 0001, a = 110 0001, 0 = 011 0000, 求 E、e、f、7、G、Z、5 的7位 ACSII 码和第一位前加入奇校验位后的8位编码。
答案与解析
教材附录未收本题解答,请对照教材自行完成。
15. 假定在一个程序中定义了变量 x、y 和 i,其中,x 和 y 是 float 型变量(用 IEEE 754 单精度浮点数表示),i 是 16 位 short 型变量(用补码表示)。程序执行到某一时刻,x = -0.125,y = 7.5,i = 100,它们都被写到了主存(按字节编址),其地址分别是 100,108 和 112。请分别画出在大端机器和小端机器上变量 x、y 和 i 在内存的存放位置。
答案与解析
参考答案: 因为 \(-0.125 = -0.001B = -1.0 \times 2^{-3}\),故 x 在机器内部的机器数为 1 01111100 00…0(BE000000H)。因为 \(7.5 = +111.1B = +1.111 \times 2^{2}\),故 y 在机器内部的机器数为 0 10000001 11100…0(40F00000H)。
| 地址 | 大端机内容 | 小端机内容 |
|---|---|---|
| 100 | BEH | 00H |
| 101 | 00H | 00H |
| 102 | 00H | 00H |
| 103 | 00H | BEH |
| 108 | 40H | 00H |
| 109 | F0H | 00H |
| 110 | 00H | F0H |
| 111 | 00H | 40H |
| 112 | 00H | 64H |
| 113 | 64H | 00H |
16. 假定某计算机的总线采用奇校验方式, 每8位数据有一位校验位, 若在32位数据线上传输的信息是8F3CAB96H, 则对应的4个校验位应为什么? 若接受方收到的数据信息和校验位分别为873CAB96H 和0101B, 则说明发生了什么情况, 并给出验证过程。
答案与解析
参考答案: 发送方按字节分别算奇校验位(每字节连同校验位配成奇数个 1):8FH(1000 1111B)含 5 个 1,校验位取 0;3CH(0011 1100B)含 4 个 1,校验位取 1;ABH(1010 1011B)含 5 个 1,校验位取 0;96H(1001 0110B)含 4 个 1,校验位取 1。故发送的 4 位奇校验位依次为 0、1、0、1。
接收方收到的数据为 873CAB96H,重新按字节计算奇校验位:第一字节 87H(1000 0111B)含 4 个 1,算得奇校验位应为 1;后三个字节未变,算得奇校验位仍为 1、0、1。拿本地重算的校验位与收到的校验位 0、1、0、1 逐位异或比对:第一字节 \(1 \oplus 0 = 1 \ne 0\),说明第一个字节在传输中发生了错误;后三个字节分别为 \(1 \oplus 1 = 0\)、\(0 \oplus 0 = 0\)、\(1 \oplus 1 = 0\),未发现错误。
17. 填写下表,注意对比无符号数和带符号整数的乘法结果,以及截断操作前、后的结果。
| 模式 | x 机器数 | x 值 | y 机器数 | y 值 |
|---|---|---|---|---|
| 无符号数 | 110 | 010 | ||
| 二进制补码 | 110 | 010 | ||
| 无符号数 | 001 | 111 | ||
| 二进制补码 | 001 | 111 | ||
| 无符号数 | 111 | 111 | ||
| 二进制补码 | 111 | 111 |
| 模式 | x×y 机器数(截断前) | x×y 值(截断前) | x×y 机器数(截断后) | x×y 值(截断后) |
|---|---|---|---|---|
| 无符号数 | ||||
| 二进制补码 | ||||
| 无符号数 | ||||
| 二进制补码 | ||||
| 无符号数 | ||||
| 二进制补码 |
答案与解析
参考答案:
| 模式 | x 机器数 | x 值 | y 机器数 | y 值 |
|---|---|---|---|---|
| 无符号整数 | 110 | 6 | 010 | 2 |
| 二进制补码 | 110 | -2 | 010 | +2 |
| 无符号整数 | 001 | 1 | 111 | 7 |
| 二进制补码 | 001 | +1 | 111 | -1 |
| 无符号整数 | 111 | 7 | 111 | 7 |
| 二进制补码 | 111 | -1 | 111 | -1 |
| 模式 | x×y 机器数(截断前) | x×y 值(截断前) | x×y 机器数(截断后) | x×y 值(截断后) |
|---|---|---|---|---|
| 无符号整数 | 001100 | 12 | 100 | 4 |
| 二进制补码 | 111100 | -4 | 100 | -4 |
| 无符号整数 | 000111 | 7 | 111 | 7 |
| 二进制补码 | 111111 | -1 | 111 | -1 |
| 无符号整数 | 110001 | 49 | 001 | 1 |
| 二进制补码 | 000001 | +1 | 001 | +1 |
对表中结果分析如下:
① 同一对 \(n\) 位机器数,按无符号乘法与按补码乘法算出的 \(2n\) 位完整乘积机器数并不相同(如 110 × 010 分别得出 001100 与 111100),但截断保留低 \(n\) 位后的机器数却完全一致(三组依次都是 100、111、001)。
② 无论无符号乘法还是补码乘法,一旦把 \(2n\) 位乘积截断成低 \(n\) 位,只要被砍掉的高位不是纯扩展位,就会发生溢出。表里的三组补码乘法凑巧都没溢出,但随便换一组如 011 × 011(\(+3 \times +3 = +9\)),6 位积 001001 截断成低 3 位变成 001(\(+1\)),同样会溢出。
18. 采用 IEEE 754 单精度浮点数格式计算下列表达式的值。
答案与解析
参考答案: 已知 \(x = 0.75 = 0.11\text{B} = (1.10\cdots0)_2 \times 2^{-1}\),\(y = -65.25 = -1000001.01\text{B} = (-1.00000101\cdots0)_2 \times 2^{6}\)。用 IEEE 754 单精度格式提取阶码与带隐藏位(括号内)的尾数:\(E_x = 0111\ 1110\text{B}, M_x = 0(1).10\cdots0\);\(E_y = 1000\ 0101\text{B}, M_y = 1(1).000001010\cdots0\)(小数点前第一位为符号位,括号内为隐藏位 1,假定末尾保留保护位与舍入位共 2 位附加位,记作粗体 00)。
(1)计算 \(x + y\):
① 对阶:求阶差 \([\Delta E]_{\text{补}} = E_x + [-E_y]_{\text{补}} = 0111\ 1110 + 0111\ 1011 = 1111\ 1001\ (\bmod\ 2^8)\),即 \(\Delta E = -7\)。小阶向大阶看齐,将 \(M_x\) 连同隐藏位右移 7 位,阶码更新为 \(E_x = E_y = 1000\ 0101\text{B}\),\(M_x = 00.000000110\cdots0\mathbf{00}\)。
② 尾数相加:
③ 规格化:所得尾数数值部分最高位已为 1,无须左规或右规。
④ 舍入:末尾两位附加位均为 00,无论哪种舍入方式,去掉附加位后均得 \(M_b = 1(1).000000100\cdots0\)。
⑤ 溢出判断:阶码未发生上溢或下溢。最终结果 \(E_b = 1000\ 0101\text{B}, M_b = 1(1).00000010\cdots0\),对应真值 \((-1.0000001)_2 \times 2^6 = -64.5\)。
(2)计算 \(x - y\):
① 对阶:与(1)完全相同,对阶后 \(E_x = E_y = 1000\ 0101\text{B}\),\(M_x = 00.000000110\cdots0\mathbf{00}\)。
② 尾数相减:\(M_b = M_x - M_y = +0.000000110\cdots0\mathbf{00} - (-1.000001010\cdots0\mathbf{00})\),按原码加减规则相加得
③ 规格化:数值部分最高位已为 1,无须规格化。
④ 舍入:去掉末尾两位附加位 00,得 \(M_b = 0(1).00001000\cdots0\)。
⑤ 溢出判断:阶码无上溢或下溢。最终结果 \(E_b = 1000\ 0101\text{B}, M_b = 0(1).00001000\cdots0\),对应真值 \((+1.00001)_2 \times 2^6 = +66\)。
19. 在 IEEE 754 浮点数运算中,当结果的尾数出现什么形式时需要进行左规,什么形式时需要进行右规?如何进行左规,如何进行右规?
答案与解析
教材附录未收本题解答,请对照教材自行完成。
13 自编客观题(补充)¶
以下 15 题按 2024 年 10 月、2025 年 4 月两卷的客观题考点自编,用于检索式回忆;不是教材原题。
13.1 单项选择题¶
1. 8 位补码能表示的整数范围是
答案与解析
参考答案: C。补码零唯一,负数端比正数端多一个 −128。
2. 补码 1111 0000B 的真值是
答案与解析
参考答案: A。按权相加:−128+64+32+16=−16。
3. 8 位补码 7FH+01H 的结果为 80H,其 OF 与 CF 是
答案与解析
参考答案: B。同号相加结果变号,有符号溢出;最高位无进位,CF=0。
4. 字符 A 的 ASCII 码为 41H,若在最高位加奇校验位,得到的 8 位编码是
答案与解析
参考答案: C。100 0001B 里有 2 个 1,奇校验要补 1 个 1,得 1100 0001B。
5. IEEE 754 单精度中,E=0、F≠0 对应的数是
答案与解析
参考答案: D。E=0 且 F=0 才是 ±0;E=255 才是无穷大或 NaN。
6. 单精度浮点能精确表示的整数,其绝对值上限是
答案与解析
参考答案: B。24 位有效位,绝对值不超过 2²⁴ 的整数都不丢精度,超出就可能舍入。
7. 32 位 12345678H 从 1000H 起按大端存放,1000H 单元的内容是
答案与解析
参考答案: A。大端把最高有效字节放在低地址;小端才是 78H 在前。
8. 若有 char a; int b; char c; 按 4 字节对齐,该结构体占多少字节
答案与解析
参考答案: D。偏移为 0、4、8,尾部再补 3 字节凑成 4 的倍数。
9. 偏置取 2ⁿ⁻¹ 的 n 位移码,与同长补码的关系是
答案与解析
参考答案: B。移码与补码只差符号位;IEEE 阶码的偏置是 127 或 1023,不是 2ⁿ⁻¹。
10. 海明码用 k 位数据、r 位校验位实现单错定位,需满足
答案与解析
参考答案: A。校验组要能区分 k+r 个位置上的单错,再加一个“无错”状态。
13.2 填空题¶
11. 8 位补码 1000 0000 的真值是 ___。
答案与解析
参考答案: −128
12. IEEE 754 单精度的阶码偏置是 ___。
答案与解析
参考答案: 127
13. 32 位 12345678H 从 1000H 起按小端存放,1000H 单元的内容是 ___。
答案与解析
参考答案: 78H
14. 偶校验要求整个码字(含校验位)中 1 的个数为 ___。
答案与解析
参考答案: 偶数
15. 单精度 C0B00000H 的真值是 ___。
答案与解析
参考答案: −5.5
14 闭卷复习与跨章联系(补充)¶
一、闭卷自答(合上书逐题口述)
- 真值与机器数差在哪?n 位原码、反码、补码、移码的取值范围各是多少?
- 补码为什么能让加减法共用一套加法器?扩宽与截断各怎么做?
- 单精度与双精度的字段怎么分?偏置各是多少?
- E=0、E=255 各对应什么数?非规格化数的值怎么算?
- 大端与小端怎么存?按 4 对齐时 char/int/char 结构体占多少字节?
- 奇校验、海明码、CRC 各能发现或纠正什么?OF 与 CF 分别怎么判?
二、本章易错
- 同一位串按无符号整数、补码或浮点格式解释时,数值可能不同;计算前先确认位宽与编码类型(第 1、2 节)。
- 逻辑右移补 0,补码算术右移复制符号位;左移只有没溢出时才能当乘 2 用(第 2 节)。
- E 全为 0 时隐藏位 1 是不存在的,不能再补;只有 \(1 \le E \le 254\) 的规格化数才补隐藏位(第 3 节)。
三、本章骨架
| 编码或机制 | 适用对象 | 关键式 |
|---|---|---|
| 补码 | 带符号整数 | 最高位权 \(-2^{n-1}\),零唯一 |
| 移码 | 阶码、数值比较 | 真值加偏置;偏置为 \(2^{n-1}\) 时,才与同字长补码相差最高位取反 |
| IEEE 754 二进制单精度 | 浮点数 | 规格化数(\(1\le E\le254\))用 \((-1)^s \times (1.F) \times 2^{E-127}\);\(E=0\) 或 \(255\) 另判 |
| 奇偶校验 | 检错 | 可检出奇数个位翻转,不能定位或纠错 |
| 海明码 | 单错定位与纠正 | \(k\) 位数据、\(r\) 位校验通常要求 \(2^r \ge k+r+1\);再加总体奇偶校验位可实现单错纠正、双错检测 |
| CRC | 检错 | 用模 2 除法取余,检错能力由生成多项式决定 |
四、跨章指路