跳转至

第2章:运算方法和运算器

Note

运算方法和运算器参考
ppt1
ppt2
ppt3

核心考点 1:机器数的底层逻辑与转换(必考基础)

考试中,原、反、补、移码的转换以及表示范围是必考的选择/填空题,也是后面做大题的基础。

  • 补码的本质(“模”的概念):

    • 在计算机中,机器字长是有限的(比如8位),因此运算是“有模的”。你可以把它想象成一个时钟,时针退3格(-3)和进9格(+9)在视觉上是同一个位置(模为12)。

    • 重点公式: 定点整数的模是 \(2^{n+1}\)(对于字长n+1位)。如果 \(-2^n \le X \le 0\),那么 \([X]_补 = 2^{n+1} + X\)

    • 神级技巧: 考试时求补码,如果是负数,最快的方法是保留原码的符号位,其余各位按位取反,最后末位加1。同样,已知补码求原码,也是“连同符号位不变,数值位取反加1”!例如 \([-X]_补\) 就是将 \([X]_补\) 连同符号位在内的全部位取反,末位加1

  • 移码(专属浮点数阶码):

    • 怎么求: 移码的数值部分与补码完全相同,只需把补码的符号位取反(1表示正,0表示负)。

    • 为什么用移码: 如果把移码中所有的位都看作是无符号数,它的大小直接反映了实际数值的大小。这在浮点数比较阶码大小时(对阶)极其方便,硬件电路判断速度极快。

核心考点 2:IEEE 754 浮点数标准(100%必考计算大题)

这是全书最大的重点之一,通常会让你将一个十进制数转换为IEEE 754格式,或者反向推导。以最常考的 32位单精度浮点数 为例:

  • 存储格式(32位): 1位符号位(S) + 8位阶码(E) + 23位尾数(M)。 IEEE754 单精度浮点数(32位):
    • 符号位:1 位
    • 阶码:8 位(偏置值 Bias = 127)
    • 尾数:23 位
  • 真值计算公式: \(X = (-1)^S \times (1.M) \times 2^{E-127}\)
  • 【考试实战演练】十进制 \(\rightarrow\) IEEE 754:

    • 例题: 将十进制数 \(20.59375\) 转换为IEEE 754单精度格式。
    • 第一步(化二进制): 整数部分 \(20 = 10100_2\),小数部分 \(0.59375 = 0.10011_2\)。合起来是 \(10100.10011_2\)
    • 第二步(规格化): 将其写成科学计数法 \(1.010010011 \times 2^4\)。此时,尾数 \(M = 010010011...\)(注意隐藏了前面的1),真实的指数 \(e = 4\)
    • 第三步(求阶码E): \(E = e + 127 = 4 + 127 = 131\)。转换为二进制是 \(10000011_2\)
    • 第四步(拼接): 符号位 \(S=0\)(正数)。最终机器码为 0 10000011 01001001100000000000000,即十六进制的 41A4C000H
  • 【常考极端值】陷阱点:

    • 最小的规格化正数: 阶码E为1(真实指数1-127=-126),尾数全为0,值为 \(1.0 \times 2^{-126}\)
    • 最大的规格化正数: 阶码E为254(真实指数254-127=+127),尾数全为1,值为 \(+(2 - 2^{-23}) \times 2^{+127}\)
    • 非规格化数 阶码全 0:E=0 说明这是非规格化数(denormalized)。 非规格化数公式: $$ x=(−1)^S \times(0.M)\times 2^{-126} $$ 注意: 规格化数:隐藏位是 1 非规格化数:隐藏位是 0

核心考点 3:定点数加减运算与“溢出检测”(必考判断/计算)

依靠补码,减法被完美转换成了加法:\([X+Y]_补 = [X]_补 + [Y]_补\)。但随之而来的是考卷上必出的溢出检测问题。

  • 什么是溢出? 两个正数相加得到负数,或者两个负数相加得到正数,这就是溢出了(一正一负相加绝不可能溢出)。
  • 【考试重点】两种溢出检测方法:

    1. 单符号位法: 公式是 \(V = C_{n-1} \oplus C_f\)。其中 \(C_{n-1}\) 是最高数值位向符号位的进位,\(C_f\) 是符号位向前的进位。如果这两个进位不一致(异或结果为1),则说明溢出
    2. 双符号位法(变形补码 - 超高频考点): 运算时使用两个符号位 \(S_{f1}S_{f2}\)(正数符号设为00,负数为11)。结果判断如下:

      • 00:结果为正,无溢出。
      • 11:结果为负,无溢出。
      • 01上溢(结果本应为正,却算出了负)。
      • 10下溢(结果本应为负,却算出了正)。
      • 溢出逻辑表达式:\(V = S_{f1} \oplus S_{f2}\)

核心考点 4:乘除法运算(注意学校具体要求)

这部分在某些学校属于难点但非必考点,如果考的话,主要抓以下规律:

  • 阵列乘法器: 如果被乘数和乘数都是负数补码,硬件在计算前,会先去掉符号位,将其余各位求反加1(即自动转化为原码的绝对值部分)参与相乘,最后通过算后求补器加上正确的符号。
  • 不恢复余数除法: 注意它的核心判定规则:如果余数为负,商0,下一步除数右移并执行加法;如果余数为正,商1,下一步除数右移并执行减法

核心考点 5:奇偶校验码(常考选择题)

  • 判断准则: 无论是奇校验还是偶校验,关键看 “数据位 + 校验位” 整体里面 1 的个数。

    • 偶校验: 整体中 1 的个数必须是偶数个。例如,数据 1010101 中有4个1,要满足偶校验,附加的校验码就必须是 0
    • 奇校验: 整体中 1 的个数必须是奇数个。

核心考点 6:运算器结构(概念理解)

  • 多总线结构: 了解现代CPU如何传输数据。例如在三总线结构中,执行加法指令 ADD R0, R1 只需两步:第一步,R0和R1的数据分别通过总线1和总线2同时打入ALU(算术逻辑单元);第二步,ALU运算结果通过总线3写回R0。这种并行结构大大提高了运算速度。

💡 给你的复习策略建议: 考试前,请务必找张草稿纸,独立手算一遍 IEEE 754 单精度浮点数的双向转换(十进制转二进制、十六进制机器码转十进制真值),并且手写一遍双符号位法(变形补码)的溢出判断

Tip

额,我觉得这种补码运算,以及二进制的乘除法都非常简单
把ppt上的题目弄会了,理解计算机如何进行二进制运算就行了,以及IEEE754浮点数,把二进制理解了,一点都不难,
我就不把ppt里题目拿出来分析了,其实这部分知识密度很小,但是不知道周老师为什么要拿三个ppt讲。

大部分题目我就不单拎出来说了,ppt和作业后面的题目都比较简单,然后我会对于作业解析不太详细的做一些补充,可以说是狗续貂尾了

教材题目P69-9

前提约定(变量定义)

设两个浮点数 \(x\)\(y\) 的规格化表示分别为:

\[ x = M_x \times 2^{E_x}, \quad y = M_y \times 2^{E_y} \]
  • \(M_x\)\(M_y\):尾数(Mantissa),通常为纯小数,常见形式为 \(0.1\cdots\)(二进制),即绝对值小于 1 且首位为 1(规格化后)。
  • \(E_x\)\(E_y\):阶码(Exponent),整数,用补码或移码表示。
  • 浮点数在计算机中通常以“阶码 + 尾数”形式存储,并且经常采用双符号位(如 \(00\) 表示正,\(11\) 表示负)进行中间运算,以便判断溢出。

在下面的流程中,我们假设:

  • 阶码用双符号位补码表示(如 \(11\,100\) 表示真值 \(-4\))。
  • 尾数用双符号位补码表示(如 \(00.101100\) 表示 \(+0.101100\)\(11.010100\) 表示 \(-0.101100\))。

标准流程(5 步)

1️⃣ 对阶
  • 目的:使 \(E_x = E_y\),从而尾数可以直接相加。
  • 变量

  • \(\Delta E = E_x - E_y\) (阶差)

  • 计算机中通过补码加法计算:\([\Delta E]_{\text{补}} = [E_x]_{\text{补}} + [-E_y]_{\text{补}}\)

  • 操作

  • \(\Delta E = 0\),已对齐。

  • \(\Delta E > 0\),说明 \(E_x > E_y\),则将 \(y\) 的尾数右移 \(\Delta E\) 位,同时 \(E_y\)\(\Delta E\)
  • \(\Delta E < 0\),说明 \(E_x < E_y\),则将 \(x\) 的尾数右移 \(|\Delta E|\) 位,同时 \(E_x\)\(|\Delta E|\)

  • 右移规则:尾数右移时高位补符号位(算术右移)。低位移出的位一般保留在“保护位”中,用于后续舍入。

2️⃣ 尾数求和
  • 目的:将对阶后的尾数相加(用补码加法)。
  • 变量
  • \(M_x'\)\(M_y'\):对阶后的尾数(已经具有相同的指数)。
  • \(M_s = M_x' + M_y'\) (和尾数)
  • 注意:使用双符号位加法,结果可能产生:
  • \(00.\cdots\) 正数
  • \(11.\cdots\) 负数
  • \(01.\cdots\) 正溢出(尾数大于等于 2)
  • \(10.\cdots\) 负溢出(尾数小于等于 -2)
3️⃣ 规格化处理
  • 目的:将和尾数 \(M_s\) 调整成规格化形式(例如 \(|M_s| \in [0.5, 1)\),即最高数值位与符号位不同)。
  • 变量
  • \(M_s\) 当前和尾数,\(E_s\) 当前阶码(取对阶后的阶码,例如 \(E_x'\)\(E_y'\))。
  • 操作
  • 左规:如果 \(M_s\) 的双符号位相同但数值部分的前导位不是 1(即形式为 \(00.0\cdots\)\(11.1\cdots\)),则尾数左移 1 位,阶码减 1,直至规格化(或出现溢出)。
  • 右规:如果尾数双符号位不同(\(01.\cdots\)\(10.\cdots\)),说明绝对值 ≥ 2,此时尾数右移 1 位,阶码加 1,并修正尾数的符号位(右移后高位补 0 或 1 取决于符号,但通常采用算术右移)。
4️⃣ 舍入处理
  • 目的:在右移(对阶或右规)过程中,低位可能被移出,需要按规则决定是否进位到保留的尾数中。
  • 常用规则
  • 0 舍 1 入(类似十进制四舍五入):若被移出的最高位是 1,则尾数末位加 1。
  • 恒舍法(截断):直接丢弃移出位。
  • 注意:舍入可能导致尾数再次溢出,此时需要再执行一次右规。
5️⃣ 溢出判断
  • 目的:最终结果的阶码是否超出了机器可表示的范围。
  • 变量
  • 最终阶码 \(E_{\text{final}}\) 的双符号位。
  • 判据
    • 若双符号位为 \(00\)\(11\),无溢出。
    • 若为 \(01\),表示上溢(正指数太大,结果 → \(+\infty\))。
    • 若为 \(10\),表示下溢(负指数太小,结果 → 0 或下溢异常)。

小结:变量一览表

符号 含义 示例(双符号位补码)
\(E_x\) \(x\) 的阶码真值 \(-5\)
\([E_x]_{\text{补}}\) 阶码的机器表示 \(11\,011\)(真值 -5)
\(M_x\) \(x\) 的尾数真值 \(-0.010110\)
\([M_x]_{\text{补}}\) 尾数的机器表示 \(11.101010\)
\(\Delta E\) 阶差 \(E_x - E_y\) \(-1\)
\(M_x'\)\(M_y'\) 对阶后的尾数 例中对阶后 \(M_x' = 11.110101\)
\(M_s\) 尾数之和(可能未规格化) \(00.001011\)
\(E_s\) 和结果当前的阶码 对阶后的阶码 \(11\,100\)
规格化后 \(M_s'\)\(E_s'\) 经过左规或右规后的尾数和阶码 \(M_s'=00.101100\)\(E_s'=11\,010\)
最终结果 \(x + y = M_{\text{final}} \times 2^{E_{\text{final}}}\) \(2^{-110} \times 0.101100\)

\({\Large (1) x = 2^{-101} \times (-0.010110),\quad y = 2^{-100} \times 0.010110,\quad \text{求 } [x+y]}\)

我自己手写的

\({\Large (1) x = 2^{-101} \times (-0.010110),\quad y = 2^{-100} \times 0.010110,\quad \text{求 } [x-y]}\)

略,这道题ppt上没问题