Files
obsidian/计算机组成原理/学习笔记/06_运算方法.md

10 KiB
Raw Blame History

第6章 运算方法

📖 本章介绍计算机中数据的表示方法和算术运算,是课程的重点和难点。 🎯 重点理解补码运算和浮点数表示


📋 本章目录


6.1 无符号数和有符号数

6.1.1 无符号数

[!info] 定义 没有符号的数,所有位都表示数值。

表示范围n位

0 \sim 2^n - 1

[!example] 示例 16位无符号数0 ~ 65535

6.1.2 有符号数

机器数与真值

概念 定义 示例
真值 带正负号的数 +1100, -1100
机器数 符号数字化的数 0,1100, 1,1100

符号编码

  • 0 表示正数
  • 1 表示负数

1. 原码表示法

[!info] 定义 符号位 + 数值的绝对值

整数原码

[x]_{原} = \begin{cases} 0,x & 2^n > x \geq 0 \\ 2^n - x & 0 \geq x > -2^n \end{cases}

小数原码

[x]_{原} = \begin{cases} x & 1 > x \geq 0 \\ 1 - x & 0 \geq x > -1 \end{cases}

[!example] 示例

  • x = +1110 → [x]原 = 0,1110
  • x = -1110 → [x]原 = 1,1110
  • x = +0.1101 → [x]原 = 0.1101
  • x = -0.1101 → [x]原 = 1.1101

零的表示

  • [+0]原 = 0.0000
  • [-0]原 = 1.0000

特点

  • 表示简单,易于转换
  • 加减运算复杂
  • 零有两种表示

2. 补码表示法

[!important] 核心思想 用正数代替负数,将减法转换为加法。

补数的概念(时钟例子):

  • 时钟模为12
  • -3 ≡ +9 (mod 12)
  • 9 - 5 = 9 + 7 = 16 ≡ 4 (mod 12)

整数补码

[x]_{补} = \begin{cases} 0,x & 2^n > x \geq 0 \\ 2^{n+1} + x & 0 > x \geq -2^n \end{cases}

小数补码

[x]_{补} = \begin{cases} x & 1 > x \geq 0 \\ 2 + x & 0 > x \geq -1 \end{cases}

[!example] 示例

  • x = +1010 → [x]补 = 0,1010
  • x = -1010 → [x]补 = 2^5 + (-1010) = 100000 - 1010 = 1,0110
  • x = +0.1001 → [x]补 = 0.1001
  • x = -0.1001 → [x]补 = 2 + (-0.1001) = 1.0111

零的表示

  • [+0]补 = [-0]补 = 0.0000(唯一表示)

补码范围n位整数

-2^n \sim +(2^n - 1)

[!warning] 特殊值 8位补码-128的补码为10000000没有对应的原码

3. 反码表示法

整数反码

[x]_{反} = \begin{cases} 0,x & 2^n > x \geq 0 \\ (2^{n+1}-1) + x & 0 \geq x > -2^n \end{cases}

小数反码

[x]_{反} = \begin{cases} x & 1 > x \geq 0 \\ (2-2^{-n}) + x & 0 \geq x > -1 \end{cases}

[!example] 示例

  • x = +1101 → [x]反 = 0,1101
  • x = -1101 → [x]反 = 1,0010

零的表示

  • [+0]反 = 0.0000
  • [-0]反 = 1.1111

4. 移码表示法

[!info] 定义 移码 = 补码符号位取反

用途:便于比较大小(移码大的真值大)

整数移码

[x]_{移} = 2^n + x \quad (-2^n \leq x < 2^n)

[!example] 示例

  • x = +1010 → [x]移 = 1,1010
  • x = -1010 → [x]移 = 0,0110

四种编码对比

编码 符号位 零的表示 范围 运算
原码 0正1负 两种 -(2^{n-1}-1) \sim +(2^{n-1}-1) 复杂
补码 0正1负 唯一 -2^{n-1} \sim +(2^{n-1}-1) 简单
反码 0正1负 两种 -(2^{n-1}-1) \sim +(2^{n-1}-1) 较复杂
移码 1正0负 唯一 -2^{n-1} \sim +(2^{n-1}-1) 便于比较

转换关系

  • 正数:原码 = 反码 = 补码
  • 负数:补码 = 反码 + 1

6.2 定点数

6.2.1 定点表示

[!info] 定义 小数点位置固定的数

两种形式

graph LR
    subgraph "定点整数"
        A1[符号位] --> B1[数值部分] --> C1[小数点在最后]
    end

    subgraph "定点小数"
        A2[符号位] --> B2[小数点] --> C2[数值部分]
    end

表示范围

类型 原码范围 补码范围
定点整数 -(2^{n-1}-1) \sim +(2^{n-1}-1) -2^{n-1} \sim +(2^{n-1}-1)
定点小数 -(1-2^{-(n-1)}) \sim +(1-2^{-(n-1)}) -1 \sim +(1-2^{-(n-1)})

6.3 浮点数

6.3.1 浮点表示

[!info] 定义 小数点位置可浮动的数,类似科学计数法。

表示形式

N = S \times r^j
  • S尾数小数
  • j阶码整数
  • r基数通常为2

存储格式

graph LR
    subgraph "浮点数格式"
        MS[阶符] --> E[阶码] --> M[数符] --> N[尾数]
    end

6.3.2 浮点数规格化

[!info] 目的 提高精度,使尾数最高位为有效数字。

规格化条件

  • 原码尾数最高位为1
  • 补码:尾数最高位与符号位相反

左规尾数左移阶码减1 右规尾数右移阶码加1

[!example] 示例 非规格化0.001011 × 2^5 左规后0.1011 × 2^2

6.3.3 IEEE 754标准

单精度32位格式

graph LR
    subgraph "IEEE 754 单精度"
        S[符号位1位] --> E[阶码8位] --> M[尾数23位]
    end

双精度64位格式

graph LR
    subgraph "IEEE 754 双精度"
        S[符号位1位] --> E[阶码11位] --> M[尾数52位]
    end

特点

  • 隐含尾数最高位1
  • 阶码用移码表示偏置值127或1023
  • 尾数用原码表示

数值计算

N = (-1)^S \times 1.M \times 2^{E-127}

[!example] 示例 单精度S=0, E=10000010, M=10010000000000000000000

  • 真值 = +1.1001 × 2^(130-127) = +1.1001 × 2^3 = +1100.1 = +12.5

6.3.4 浮点数范围

类型 最小正数 最大正数 溢出条件
规格化 2^{-1} \times 2^{-2^{k-1}} (1-2^{-n}) \times 2^{2^{k-1}-1} 阶码溢出

6.4 定点运算

6.4.1 移位运算

算术移位

编码 左移 右移
原码 数值左移右补0 数值右移左补0
补码 数值左移右补0 数值右移,左补符号位
反码 数值左移右补0 数值右移,左补符号位

逻辑移位

  • 逻辑左移高位移出低位补0
  • 逻辑右移低位移出高位补0

6.4.2 补码加减运算

[!important] 核心公式

[x+y]_{补} = [x]_{补} + [y]_{补} [x-y]_{补} = [x]_{补} + [-y]_{补}

溢出判断

方法 条件 说明
单符号位 符号位进位与最高位进位异或 结果为1则溢出
双符号位 两个符号位不同 01正溢10负溢
变形补码 双符号位 同上

[!example] 示例 8位补码x = +100, y = +100

  • 补 = 0,01100100
  • [y]补 = 0,01100100
  • [x+y]补 = 0,11001000+200
  • 结果正确,无溢出

6.4.3 乘法运算

原码一位乘法

算法

  1. 符号位单独处理(异或)
  2. 数值部分相乘
  3. 部分累加

流程

graph TB
    A[初始化] --> B{乘数末位}
    B -->|1| C[加被乘数]
    B -->|0| D[加0]
    C --> E[右移部分积]
    D --> E
    E --> F{n次?}
    F -->|否| B
    F -->|是| G[得到乘积]

补码一位乘法Booth算法

特点

  • 符号位参与运算
  • 最后一步不移位
  • 根据乘数末两位决定操作

操作规则

乘数末两位 操作
00 部分积右移
01 加[x]补,右移
10 加[-x]补,右移
11 部分积右移

6.4.4 除法运算

原码一位除法(恢复余数法)

算法

  1. 符号位单独处理
  2. 被除数减除数
  3. 若够减商1不够减商0恢复余数
  4. 左移,重复

加减交替法(不恢复余数法)

特点

  • 不恢复余数
  • 根据余数符号决定下一步操作

操作规则

余数符号 操作
左移,减除数 1
左移,加除数 0

6.5 浮点运算

6.5.1 浮点加减运算

步骤

graph TB
    A[对阶] --> B[尾数运算]
    B --> C[规格化]
    C --> D[舍入处理]
    D --> E[溢出判断]

1. 对阶

目的:使两个操作数的阶码相同

方法:小阶向大阶看齐,小阶尾数右移

[!example] 示例 x = 0.1101 × 2^3, y = 0.1011 × 2^1

  • 对阶y = 0.001011 × 2^3
  • 尾数运算0.1101 + 0.001011 = 0.111111
  • 结果0.111111 × 2^3

2. 尾数运算

  • 按定点加减运算规则
  • 使用双符号位

3. 规格化

  • 左规尾数左移阶码减1
  • 右规尾数右移阶码加1

4. 舍入处理

方法 规则 特点
0舍1入 移出位为1则入 误差小
恒置1 右移后末位置1 简单

5. 溢出判断

  • 上溢:阶码大于最大值,溢出中断
  • 下溢阶码小于最小值置0

6.5.2 浮点乘除运算

乘法

N_1 \times N_2 = (S_1 \times S_2) \times r^{j_1+j_2}

除法

N_1 / N_2 = (S_1 / S_2) \times r^{j_1-j_2}

步骤

  1. 阶码加/减
  2. 尾数乘/除
  3. 规格化
  4. 溢出判断

📝 本章小结

核心概念

  1. 数据表示:原码、补码、反码、移码
  2. 定点数:小数点位置固定
  3. 浮点数:小数点位置可变,类似科学计数法
  4. 运算方法:移位、加减、乘除

关键公式

  • 补码加法[x+y]_{补} = [x]_{补} + [y]_{补}
  • 补码减法[x-y]_{补} = [x]_{补} + [-y]_{补}
  • 浮点数N = S \times r^j
  • IEEE 754N = (-1)^S \times 1.M \times 2^{E-127}

重点图示

[!summary] 必须掌握的内容

  1. 四种编码方式的转换关系
  2. 补码加减运算及溢出判断
  3. 浮点数加减运算步骤
  4. IEEE 754标准格式

🧪 自测练习

概念题

  1. 比较原码、补码、反码的特点。
  2. 说明浮点数规格化的目的和方法。
  3. 解释IEEE 754标准的格式。

计算题

  1. 将十进制数转换为补码表示。
  2. 进行补码加减运算并判断溢出。
  3. 进行浮点数加减运算。

分析题

  1. 说明Booth算法的原理和步骤。
  2. 设计一个浮点加法器的数据通路。

🔗 相关链接


本章难度: 困难 重要程度: 核心重点