跳转至

第 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ⁱ,小数点右侧的位权依次为 r⁻¹、r⁻²。各位数字乘以对应位权再求和,即得该数的值。

十进制整数转换为二进制时,反复除以 2 并记录余数,再把余数倒序排列;小数部分则反复乘以 2,按顺序记录整数部分,转换可能无限循环。二进制转八进制每 3 位一组,转十六进制每 4 位一组。分组以小数点为界向两侧进行,最外侧不足一组时补零。

例:(45.625)₁₀=(101101.101)₂=(2D.A)₁₆。0.1₁₀不能用有限位二进制小数精确表示,浮点误差由此产生。

真值是实际的数学值,机器数是指定编码下的位串。下表按 n 位字长、含一位符号位列出:

编码 正数 负数 整数范围与零
原码 符号0+绝对值 符号1+绝对值 ±(2ⁿ⁻¹−1),有±0
反码 同原码 正数编码逐位取反 同原码,有±0
补码 同原码 正数编码取反加1 −2ⁿ⁻¹至2ⁿ⁻¹−1,零唯一
移码 真值加偏置后编码 同一规则 范围取决于偏置,不可默认所有格式偏置相同

8 位 −5 的三种编码:原码 10000101,反码 11111010,补码 11111011。n 位补码的最高位权为 −2ⁿ⁻¹,其余位权不变。11111011 按权相加得 −128+123=−5。常见偏置 2ⁿ⁻¹ 的移码与补码只有最高位相反;IEEE 阶码使用的偏置另有规定。

2 整数的表示(2,领会、简单应用)

n 位无符号数的范围是 0 至 2ⁿ−1,补码的范围是 −2ⁿ⁻¹ 至 2ⁿ⁻¹−1。补码相加按模 2ⁿ 运算,符号位参与计算,最终只保留 n 位。这样加法与减法就能共用同一加法器。

  • 无符号数扩宽补 0;补码扩宽复制符号位,例如 8 位 −5 扩为 16 位是 11111111 11111011。
  • 截断保留低位,可能改变真值。同一位置串按有符号或无符号解释,数值也不同:8 位 FFH 分别为 −1 或 255。
  • C 语言类型转换应先明确位宽和规则。有符号溢出不能简单当成语言保证的环绕行为,机器截断结果与语言层面的合法语义要分开看。

3 实数与 IEEE 754(3,领会、简单应用)

整数编码的小数点位置固定,表示范围受位数限制。浮点表示把数值分成符号、尾数和阶码,用“符号×尾数×基数的阶次”描述,从而在有限位数下覆盖更大的范围。阶码位数主要决定范围,尾数有效位数主要决定精度。二进制规格化的非零数通常写成 ±1.f×2ᵉ。

格式 符号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 与无穷大不是一回事。

编码算例:−13.25=−1101.01₂=−1.10101₂×2³。s=1,E=130=10000010₂,F=10101000000000000000000,整体为 C1540000H。解码时先判断特殊阶码,再套公式;E=0 时不能再补隐藏位 1。

整数转浮点可能丢精度;浮点转整数可能截去小数,也可能越界。单精度能精确表示所有绝对值不超过 2²⁴ 的整数,但表示不了全部 32 位整数。

4 非数值数据(4,领会)

二进制位串也能表示逻辑值和字符,具体含义由编码规则决定。逻辑值的真假约定随语言或机器而变。ASCII 基本码用 7 位,可表示 128 个字符,存储时常占一个字节。字符 '0' 的编码是 30H,与数值 0 的全零编码含义并不相同。

GB 2312 中的汉字编码涉及区位码、国标码和机内码。把区号、位号分别加 20H,可得到相应的国标码字节;再把各字节的最高位置 1,就是常见的双字节机内码。区号、位号若以十进制给出,应先按其数值转换,不能把十进制书写形式直接当作十六进制码值。

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 的规则可能不同,计算前先写明假设。

6 数据校验码(6,领会、简单应用)

偶校验要求含校验位的整个码字中 1 的个数为偶数,奇校验则要求为奇数。数据 1011001 含 4 个 1,故偶校验位为 0,奇校验位为 1。单个奇偶位能检出奇数个位翻转,但不能定位纠错,也检出不了所有偶数位错误。

海明码让多个校验组交叉覆盖数据。校验位一般放在 1、2、4、8 等位置,综合各组的校验结果即可定位单比特错误。k 位数据配 r 位校验位时,单错定位通常要求 2ʳ≥k+r+1;再加一个总体奇偶位,还能扩展检错能力。

CRC 把位串看作 GF(2) 多项式,用模 2 除法产生余数。r 次生成多项式对应 r 位校验码,计算步骤是:数据后补 r 个 0 → 除以生成多项式 → 取 r 位余数拼接;接收时再除一次检验。模 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;负奇数算术右移的结果,也不一定等于语言规定的向零除法结果。

8 定点乘法(8,领会、简单应用)

无符号乘法按乘数的每一位决定是否累加移位后的被乘数,本质是部分积相加。n 位×n 位通常保留 2n 位积。原码乘法先异或符号位,再计算绝对值乘积。

例:0101₂×0011₂=00000101+00001010=00001111₂。若是 −5×3,真值为 −15,8 位补码积为 11110001。

补码乘法可用 Booth 思想处理连续的 1。在乘数低端附加一个 0,每步观察 (Q₀,Q₋₁):01 加被乘数,10 减被乘数,00 或 11 不加减,然后对部分积与乘数组合算术右移,重复指定位数。运算要保持符号扩展,极值情形可能还需要扩展位。不能把补码直接当无符号数相乘后不加解释。

9 定点除法(9,领会)

除法通过比较、减法和移位逐位生成商。恢复余数法先试减除数:余数非负则商 1,为负则商 0 并恢复原余数。加减交替法保留负余数,下一轮用加法修正,省去了恢复操作。

除法结果应满足“被除数=除数×商+余数”。例如 13÷3 的商为 4、余数为 1。带符号整数的商和余数符号,还要按规定的舍入方向确定。除数为 0 属于异常情况;n 位补码最小负数除以 −1 时,所得正商超出 n 位补码范围。定点小数除法还涉及隐含小数点和缩放,计算前需确定商的表示范围。

10 浮点数运算(10,领会、简单应用)

浮点加减要求两数的小数点位置一致,因此先比较阶码,把较小阶码对应的尾数右移,使两数阶码相同,再完成尾数加减。所得尾数可能不再满足规格化要求:若产生进位,需右移尾数并增大阶码;若减法使前导有效位消失,则可能需左移尾数并减小阶码。规格化之后进行舍入,再检查阶码范围和特殊结果。舍入本身也可能引起进位,结果有时还需再调整一次。

例:1.100₂×2²+1.000₂×2⁰=1.100₂×2²+0.010₂×2²=1.110₂×2²=7。对阶时要先保留附加位,最后统一舍入;过早截断会增大误差。

常用附加信息为保护位 G、舍入位 R 和粘滞位 S,其中 S 概括更低各位是否存在 1。舍入方式有四类:向最近(恰好中点取偶)、向 0、向 +∞、向 −∞。最近取偶规则下,若被丢弃部分恰为半个末位单位,保留结果的最低位取偶。

浮点乘法:符号异或、真实阶码相加、尾数相乘、规格化舍入;除法:符号异或、真实阶码相减、尾数相除、规格化舍入。存储阶码含偏置,不能直接相加而忘了偏置修正。浮点加法受舍入影响,不一定满足结合律。

11 考核要求

本章重点为无符号数表示、带符号整数补码表示、IEEE 754 浮点标准、定点数移位、整数加减、浮点加减、ALU 的功能与实现;难点为 IEEE 浮点数的表示范围、特殊数(NaN、无穷大)的表示、定点乘除运算、浮点乘除运算。大纲说明难点并非重点,主要注重方法和思路,不要求死记递推公式。

12 教材本章习题

本节按“单项选择题/填空题/简答题”分节,答案依据教材附录。

自测题(自编) 参考答案与辨析
8 位 80H 的无符号值和补码值? 128、−128。
8 位补码最小数取负是否仍可表示? 不能表示+128,发生有符号溢出。
单精度 E=0 是否表示指数−127 且尾数 1.F? 否,应按零或非规格化数规则。
8 位 FEH+02H 的 OF、CF? OF=0,CF=1。
大端存储是否反转每个字节中的位? 否,端序只改变字节顺序,不改变字节内的位序。
浮点减法得到很多前导 0 后怎么办? 左规、调整阶码,再舍入和检查。

复习顺序建议:补码与范围 → 加减与标志 → IEEE 编码 → 端序对齐 → 浮点加减 → 校验码与乘除方法。

13 闭卷复习与跨章联系(补充)

本章的编码规则是后续章节的输入。第 3 章的寻址方式要把地址字段解释成数值;第 7 章讨论的整数范围与溢出,直接影响程序正确性;第 4 章数据通路中的 ALU 与标志寄存器,正是第 7 节的硬件实现。计算题的常见毛病是先算数、后确认位宽与解释类型,本章各表都应按“先定长度和编码,再定数值”的顺序使用。