# 第6章 运算方法 > 📖 本章介绍计算机中数据的表示方法和算术运算,是课程的重点和难点。 > 🎯 重点理解补码运算和浮点数表示 --- ## 📋 本章目录 - [[#6.1 无符号数和有符号数]] - [[#6.2 定点数]] - [[#6.3 浮点数]] - [[#6.4 定点运算]] - [[#6.5 浮点运算]] - [[#本章小结]] --- ## 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] 定义 > 小数点位置固定的数 **两种形式**: ```mermaid 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) **存储格式**: ```mermaid 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位)格式**: ```mermaid graph LR subgraph "IEEE 754 单精度" S[符号位1位] --> E[阶码8位] --> M[尾数23位] end ``` **双精度(64位)格式**: ```mermaid 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 > - [x]补 = 0,01100100 > - [y]补 = 0,01100100 > - [x+y]补 = 0,11001000(+200) > - 结果正确,无溢出 ### 6.4.3 乘法运算 #### 原码一位乘法 **算法**: 1. 符号位单独处理(异或) 2. 数值部分相乘 3. 部分累加 **流程**: ```mermaid 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 浮点加减运算 **步骤**: ```mermaid 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 754**:$N = (-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. 设计一个浮点加法器的数据通路。 --- ## 🔗 相关链接 - [[05_输入输出系统]] - 上一章 - [[07_指令系统]] - 下一章 - [[08_CPU结构与功能]] - 运算器实现 - [[04_存储器]] - 数据存储 --- *本章难度:⭐⭐⭐⭐⭐ 困难* *重要程度:⭐⭐⭐⭐⭐ 核心重点*