【王道考研·计算机组成原理】第2章 数据的表示和运算(整章完整版)

引言

第二章是计组里最容易“算错细节”的章节。

它的核心不是死记格式,而是把三件事打通:

  1. 数在机器里怎么编码。
  2. 运算器按什么规则做加减乘除。
  3. 溢出、舍入、精度损失为什么发生。

这一章学扎实,后面 ALU、CPU 控制和异常中断会更顺。

图像化理解(Mermaid)


一、数制与编码基础

1. 进位计数制

  1. 二进制、八进制、十进制、十六进制转换是基础题。
  2. 十六进制和二进制按 4 位一组对应。
  3. 八进制和二进制按 3 位一组对应。

2. 机器数与真值

  1. 真值:人类理解的带符号数值。
  2. 机器数:按编码规则写入寄存器/存储器的比特串。
  3. 通常最高位为符号位(定点有符号场景)。

3. 常见编码

  1. BCD:4 位编码 1 个十进制数字。
  2. ASCII:字符编码(考点常在“码值区间”)。
  3. 余 3 码、2421 码属于十进制编码,格雷码相邻编码仅 1 位不同,常用于降低转换误差。

4. 校验码(补充考点)

  1. 奇偶校验:可检错但不能纠错。
  2. CRC:适合成块数据传输检错。
  3. 海明码:可实现单比特纠错、双比特检错(常考编码位个数)。

二、定点数表示

1. 原码、反码、补码、移码

原码

  1. 符号位 + 数值绝对值。
  2. 存在 +0-0 两种零。

反码

  1. 正数反码等于原码。
  2. 负数反码为原码符号位不变,其余位按位取反。

补码(重点)

  1. 正数补码等于原码。
  2. 负数补码 = 反码 + 1。
  3. 补码实现“加减统一成加法”。
  4. n 位补码范围:[-2^(n-1), 2^(n-1)-1]

移码

  1. 通常用于表示浮点阶码。
  2. 移码 = 真值 + 偏置值(bias)。

2. 为什么补码更适合硬件

  1. 0 唯一表示,简化硬件。
  2. 减法可转加法,ALU 结构统一。
  3. 符号位可参与运算。

三、定点加减运算与溢出

1. 补码加减规则

  1. 按无符号二进制相加。
  2. 舍弃最高位进位(超出字长部分)。
  3. 结果按补码解释。

2. 溢出判断(高频)

同号相加、异号相减更可能溢出。

常用判据:

  1. 两个同号数相加,结果符号变了,则溢出。
  2. 双符号位法:最高两位不同表示溢出。
  3. 进位判别法:符号位的进位与最高数值位进位不同,则有符号溢出。

3. 逻辑移位与算术移位

  1. 逻辑左移/右移:空位补 0(常用于无符号)。
  2. 算术右移:符号位扩展(有符号补码常用)。
  3. 算术左移与逻辑左移在多数实现中表现一致,但溢出语义要区分。
  4. 右移通常不会产生有符号溢出,但可能因移出低位而丢失精度。

4. 条件码与状态标志位

  1. CF:主要反映无符号加减中的进位或借位情况。
  2. OF:反映有符号运算结果是否超出补码表示范围。
  3. SF:结果符号位,常用于有符号比较。
  4. ZF:结果是否为 0。
  5. 考题常把 CF 和 OF 对比:前者更偏向无符号意义,后者更偏向有符号意义。

5. 数据类型转换规则(补充考点)

  1. 同字长下有符号数与无符号数互转时,位模式不变,只是解释方式不同。
  2. 小字长扩到大字长时,有符号数常做符号扩展,无符号数常做零扩展。
  3. 大字长缩到小字长时通常直接截去高位,可能导致值改变甚至符号变化。
  4. int -> float/double 可能丢失精度;float/double -> int 可能发生截断或越界。

四、定点乘除法(理解级)

1. 乘法

  1. 可理解为“部分积 + 移位累加”。
  2. 常见算法:Booth(考试多考思想与步骤)。
  3. 原码一位乘法本质是“判乘数末位 -> 加部分积 -> 右移”。

2. 除法

  1. 核心是“试商 + 恢复/不恢复余数”。
  2. 关注符号处理与余数范围。
  3. 不恢复余数法通过加减交替减少一次恢复操作,是考题常见比较点。

3. 加法器与硬件实现

  1. 一位全加器由加数、被加数和低位进位产生本位和与高位进位。
  2. 串行进位加法器结构简单,但高位必须等待低位进位传播。
  3. 先行进位加法器预先计算进位生成/传递关系,用硬件复杂度换速度。
  4. 在先行进位思想中,通常把“本位是否产生进位”与“本位是否传递进位”作为核心中间量,再并行求出高位进位。

五、浮点数表示与 IEEE754

1. 基本形式

1
N = (-1)^S × M × 2^E

其中:

  1. S 是符号位。
  2. M 是尾数(规格化时通常形如 1.x)。
  3. E 是指数。

2. 规格化

  1. 目的:保证表示唯一性、提升精度利用率。
  2. 二进制规格化通常要求尾数最高有效位为 1。
  3. 左规会使阶码减小,右规会使阶码增大;浮点加减中常先对阶,再尾数运算,再规格化。

3. IEEE754 单精度(32 位)

  1. 符号位 S:1 位。
  2. 指数域 E:8 位(偏置 127)。
  3. 尾数字段 F:23 位(隐藏位机制)。

4. IEEE754 双精度(64 位)

  1. 符号位 1 位。
  2. 指数域 11 位(偏置 1023)。
  3. 尾数字段 52 位。

5. 特殊值

  1. E 全 0:非规格化数或 0。
  2. E 全 1 且 F 全 0:±∞
  3. E 全 1 且 F 非 0:NaN。

6. 浮点运算高频细节

  1. 对阶只能让小阶向大阶对齐,否则会丢失高位有效信息。
  2. 尾数右移时常保留保护位、舍入位、粘滞位,以降低舍入误差。
  3. 尾数溢出通常可通过右规修正;真正决定浮点溢出的关键是阶码是否越界。

7. 浮点加减法五步法

  1. 对阶:小阶向大阶对齐。
  2. 尾数运算:做加法或减法。
  3. 规格化:必要时左规或右规。
  4. 舍入:结合附加位修正尾数。
  5. 判溢:重点看阶码是否越界。

8. 常见舍入方式

  1. 0 舍 1 入:看被舍去部分最高位决定是否加 1。
  2. 恒置 1:右移后末位恒置 1,属于一种近似处理方式。
  3. 直接截断:实现最简单,但精度损失最大。

六、PDF 例题与考点补充(第2章)

例题 1:8 位补码表示范围

题目:8 位补码整数可表示范围是多少。

解:

1
[-2^7, 2^7 - 1] = [-128, 127]

例题 2:补码求值

题目:11110110(8 位补码)对应十进制。

解:

  1. 符号位为 1,说明是负数。
  2. 取反加一:00001010,即 10。
  3. 真值为 -10

例题 3:补码加法溢出

题目:8 位补码中 01111100 + 00001010 是否溢出。

解:

1
01111100(124) + 00001010(10) = 10000110

两正数相加得负数,溢出。

例题 4:浮点规格化

题目:将二进制 0.001101 规格化。

解:

1
0.001101 = 1.101 × 2^-3

例题 5:IEEE754 偏置理解

题目:单精度指数域存储值 130,对应真实指数是多少。

解:

1
E = 130 - 127 = 3

例题 6:右移区别

题目:10010000 做逻辑右移 2 位与算术右移 2 位结果分别是什么。

解:

  1. 逻辑右移:00100100
  2. 算术右移:11100100(符号扩展)。

例题 7:两个零的问题

题目:为什么补码系统中只有一个 0。

解:

  1. 补码把负数映射到模环。
  2. +0-0 表示合并,简化判断逻辑。

七、高频易错点

  1. 把“反码 + 1”写成“原码 + 1”。
  2. 溢出判断只看进位而不看符号关系。
  3. 把逻辑右移当算术右移。
  4. 忘记 IEEE754 指数域是偏置编码。
  5. 浮点比较时忽略舍入误差与精度损失。

八、本章速记清单

  1. n 位补码范围:[-2^(n-1), 2^(n-1)-1]
  2. 负数补码:反码 + 1。
  3. 同号相加符号变,通常溢出。
  4. 单精度偏置值是 127。
  5. 浮点数由符号、阶码、尾数组成。

总结

第二章本质上是在回答:

  1. 数据怎样被机器“编码”。
  2. 运算怎样在编码层面“可实现”。
  3. 精度与溢出怎样被“系统化处理”。

把补码与 IEEE754 真正吃透,后面 ALU、流水线异常和数值题会非常稳。


作者:[Austoin]
参考来源:E:\PDF\计算机组成原理(含新大纲考点).pdf、E:\PDF\2027计算机组成原理_高清带书签版.pdf(章节知识点整合)