跳转至

第 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 国标汉字编码采用双字节,并区分以下三种码及其转换关系:

\[\text{区位码(十进制区号、位号先转十六进制)} \xrightarrow{\text{两字节各}+20\text{H}} \text{国标码} \xrightarrow{\text{两字节最高位各置 } 1\text{(即各}+80\text{H\text{)}}} \text{汉字机内码}\]

这两步用于区分编码范围:区位码各加 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。

\[ \begin{aligned} \text{除数}\times\text{商}+\text{余数} &=0.1101\times0.1101+0.0000\ 0111\\ &=0.1010\ 1001+0.0000\ 0111\\ &=0.1011\ 0000=0.1011=\text{被除数} \end{aligned} \]

其中 \(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 单精度格式为

\[0\ 011\ 1111\ 1\ 101\ 0000\ 0000\ 0000\ 0000\ 0000\text{B}\]

十六进制形式为 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 单精度格式为

\[1\ 011\ 1110\ 001\ 0000\ 0000\ 0000\ 0000\ 0000\text{B}\]

十六进制形式为 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 位二进制为

\[0\ 1000\ 1001\ 0000\ 0000\ 0010\ 0000\ 0000\ 000\text{B}\]

十六进制为 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}\)。

② 尾数相加:

\[\begin{aligned}M_b &= M_x + M_y = 00.000000110\cdots0\mathbf{00} + 11.000001010\cdots0\mathbf{00}\\ &= +0.000000110\cdots0\mathbf{00} + (-1.000001010\cdots0\mathbf{00}) = -1.000000100\cdots0\mathbf{00}\end{aligned}\]

③ 规格化:所得尾数数值部分最高位已为 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})\),按原码加减规则相加得

\[0.000000110\cdots0\mathbf{00} + 1.000001010\cdots0\mathbf{00} = +1.00001000\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 位补码能表示的整数范围是

  • A. −127~+127

  • B. −128~+128

  • C. −128~+127

  • D. 0~255

答案与解析

参考答案: C。补码零唯一,负数端比正数端多一个 −128。

2. 补码 1111 0000B 的真值是

  • A. −16

  • B. +240

  • C. −15

  • D. −112

答案与解析

参考答案: A。按权相加:−128+64+32+16=−16。

3. 8 位补码 7FH+01H 的结果为 80H,其 OF 与 CF 是

  • A. OF=0、CF=0

  • B. OF=1、CF=0

  • C. OF=0、CF=1

  • D. OF=1、CF=1

答案与解析

参考答案: B。同号相加结果变号,有符号溢出;最高位无进位,CF=0。

4. 字符 A 的 ASCII 码为 41H,若在最高位加奇校验位,得到的 8 位编码是

  • A. 41H

  • B. 81H

  • C. C1H

  • D. E1H

答案与解析

参考答案: C。100 0001B 里有 2 个 1,奇校验要补 1 个 1,得 1100 0001B。

5. IEEE 754 单精度中,E=0、F≠0 对应的数是

  • A. 零

  • B. 无穷大

  • C. NaN

  • D. 非规格化数

答案与解析

参考答案: D。E=0 且 F=0 才是 ±0;E=255 才是无穷大或 NaN。

6. 单精度浮点能精确表示的整数,其绝对值上限是

  • A. 2²³

  • B. 2²⁴

  • C. 2³¹

  • D. 2³²

答案与解析

参考答案: B。24 位有效位,绝对值不超过 2²⁴ 的整数都不丢精度,超出就可能舍入。

7. 32 位 12345678H 从 1000H 起按大端存放,1000H 单元的内容是

  • A. 12H

  • B. 78H

  • C. 34H

  • D. 56H

答案与解析

参考答案: A。大端把最高有效字节放在低地址;小端才是 78H 在前。

8. 若有 char a; int b; char c; 按 4 字节对齐,该结构体占多少字节

  • A. 6

  • B. 8

  • C. 9

  • D. 12

答案与解析

参考答案: D。偏移为 0、4、8,尾部再补 3 字节凑成 4 的倍数。

9. 偏置取 2ⁿ⁻¹ 的 n 位移码,与同长补码的关系是

  • A. 完全相同

  • B. 只有最高位相反

  • C. 各位按位取反

  • D. 数值相差 1

答案与解析

参考答案: B。移码与补码只差符号位;IEEE 阶码的偏置是 127 或 1023,不是 2ⁿ⁻¹。

10. 海明码用 k 位数据、r 位校验位实现单错定位,需满足

  • A. 2ʳ ≥ k+r+1

  • B. 2ʳ ≥ k

  • C. 2ʳ ≥ k+r

  • D. r ≥ k

答案与解析

参考答案: 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 闭卷复习与跨章联系(补充)

一、闭卷自答(合上书逐题口述)

  1. 真值与机器数差在哪?n 位原码、反码、补码、移码的取值范围各是多少?
  2. 补码为什么能让加减法共用一套加法器?扩宽与截断各怎么做?
  3. 单精度与双精度的字段怎么分?偏置各是多少?
  4. E=0、E=255 各对应什么数?非规格化数的值怎么算?
  5. 大端与小端怎么存?按 4 对齐时 char/int/char 结构体占多少字节?
  6. 奇校验、海明码、CRC 各能发现或纠正什么?OF 与 CF 分别怎么判?

二、本章易错

  1. 同一位串按无符号整数、补码或浮点格式解释时,数值可能不同;计算前先确认位宽与编码类型(第 1、2 节)。
  2. 逻辑右移补 0,补码算术右移复制符号位;左移只有没溢出时才能当乘 2 用(第 2 节)。
  3. 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 除法取余,检错能力由生成多项式决定

四、跨章指路

  1. 寻址方式(见第 3 章)要把地址字段解释成数值,位宽判断与符号扩展的规则直接沿用本章。
  2. 数据通路中的 ALU 与标志寄存器,正是本章第 7 节的硬件实现,见第 4 章。
  3. 本章各表都应按“先定长度和编码,再定数值”的顺序使用;先算数后问位宽是计算题的常见失分点。