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

415 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第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
无符号数就像你钱包里的钱只有正数没有负数范围从0到最大值。内存地址、数组索引、颜色值通常用无符号数表示。
### 6.1.2 有符号数
#### 机器数与真值
| 概念 | 定义 | 示例 |
|------|------|------|
| **真值** | 带正负号的数 | +1100, -1100 |
| **机器数** | 符号数字化的数 | 0,1100, 1,1100 |
**符号编码**
- 0 表示正数
- 1 表示负数
真值用"+"和"-"表示正负人容易理解但计算机不好处理机器数用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
**特点**:表示简单易于转换,但加减运算复杂,零有两种表示。
原码用0表示正数1表示负数后面跟着数值的绝对值。表示简单容易理解但加减运算需要考虑符号零有两种表示+0和-0。就像温度计用"+"和"-"表示零上和零下。
#### 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没有对应的原码
补码可以用时钟来理解时钟模为12-3小时相当于+9小时因为-3+12=9。补码就是用正数代替负数将减法转换为加法。正数直接用原码表示负数用模减去绝对值。
比如8位二进制-10的补码是256-10=246=11110110。补码的优点是加减运算简单不需要考虑符号零只有一种表示范围比原码大1。缺点是表示不直观需要转换。所有整数运算都用补码。
#### 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
反码是补码减1正数和原码相同负数是原码除符号位外取反。是计算补码的中间步骤某些旧计算机使用反码。
#### 4. 移码表示法
> [!info] 定义
> 移码 = 补码符号位取反
**用途**:便于比较大小(移码大的真值大)
**整数移码**
$$[x]_{移} = 2^n + x \quad (-2^n \leq x < 2^n)$$
> [!example] 示例
> - x = +1010 → [x]移 = 1,1010
> - x = -1010 → [x]移 = 0,0110
移码把所有数都加上一个偏移量变成正数便于比较大小。偏移量是1288位移码-128变成00变成128+127变成255。浮点数的阶码通常用移码表示。
#### 四种编码对比
| 编码 | 符号位 | 零的表示 | 范围 | 运算 |
|------|--------|----------|------|------|
| 原码 | 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。
原码直接用符号位和绝对值简单直观但运算复杂零有两种表示补码用正数代替负数运算简单零只有一种表示但表示不直观反码是补码减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)})$ |
定点数用固定刻度的尺子定点整数小数点在最后只表示整数比如1010表示10定点小数小数点在符号位后面只表示小数比如0.1010表示0.625。
---
## 6.3 浮点数
### 6.3.1 浮点表示
> [!info] 定义
> 小数点位置可浮动的数,类似科学计数法。
**表示形式**
$$N = S \times r^j$$
- S尾数小数
- j阶码整数
- r基数通常为2
**存储格式**
```mermaid
graph LR
subgraph "浮点数格式"
MS[阶符] --> E[阶码] --> M[数符] --> N[尾数]
end
```
浮点数就像科学计数法把一个数表示成尾数乘以2的阶码次方。比如101.1=1.011×可以表示很大或很小的数。
### 6.3.2 浮点数规格化
**规格化目的**提高精度使尾数的最高位为1。
**规格化方法**
- **左规**尾数左移阶码减1
- **右规**尾数右移阶码加1
规格化前0.001011×2³尾数前面有0精度低规格化后1.011×2⁰尾数最高位为1精度高。
### 6.3.3 IEEE 754标准
**单精度浮点数32位**符号位1位阶码8位移码表示尾数23位
**双精度浮点数64位**符号位1位阶码11位移码表示尾数52位
IEEE 754标准是浮点数的"国家标准"单精度32位精度较低但速度快用于大多数图形处理和科学计算双精度64位精度高但速度慢用于高精度科学计算和金融计算。
---
## 6.4 定点运算
### 6.4.1 移位运算
**算术移位**左移相当于乘以2右移相当于除以2
**逻辑移位**左移高位移出低位补0右移低位移出高位补0
算术移位像移动小数点左移小数点向右移动数值变大右移小数点向左移动数值变小。逻辑移位所有位向左或向右移动。1010左移1位变成1010010→20
### 6.4.2 加减运算
**补码加减运算**:加法直接相加,减法减数变补码后相加
**溢出判断**:正溢出两个正数相加结果为负,负溢出两个负数相加结果为正
补码加减运算像时钟运算9+7=16≡4(mod 12)9-5=9+7=16≡4(mod 12)。127+1=-1288位补码溢出
### 6.4.3 乘法运算
**原码乘法**:符号位单独处理,数值部分相乘
**补码乘法**:直接用补码相乘
乘法运算像重复加法10×13=130-6×-3=18。
### 6.4.4 除法运算
**原码除法**:符号位单独处理,数值部分相除
**补码除法**:直接用补码相除
除法运算像重复减法10÷2=5-6÷2=-3。
---
## 6.5 浮点运算
### 6.5.1 浮点加减运算
**步骤**
1. **对阶**:使两个数的阶码相同
2. **尾数运算**:对阶后进行尾数加减
3. **规格化**:结果规格化
4. **舍入**:处理精度问题
5. **溢出判断**:检查阶码是否溢出
浮点加减运算像科学计数法加减:对阶使两个数的阶码相同,小阶向大阶看齐;尾数运算对阶后进行尾数加减;规格化使结果符合规格化要求;舍入处理精度问题;溢出判断检查阶码是否溢出。
1.01×2²+1.10×对阶变成1.01×2²+0.110×尾数运算1.01+0.110=10.00规格化10.00×2²=1.00×2³=8。
### 6.5.2 浮点乘除运算
**乘法**:阶码相加,尾数相乘,规格化
**除法**:阶码相减,尾数相除,规格化
浮点乘除运算像科学计数法乘除10²×10³=10⁵1.2×3.4=4.081.2×10²×3.4×10³=4.08×10⁵。
---
## 📝 本章小结
### 核心概念
1. **数据表示**:原码、补码、反码、移码
2. **定点数**:小数点位置固定
3. **浮点数**:小数点位置可浮动
4. **定点运算**:移位、加减、乘除
5. **浮点运算**:对阶、尾数运算、规格化
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| 原码 | Sign-Magnitude | 符号位+绝对值 |
| 补码 | Two's Complement | 用正数代替负数 |
| 反码 | One's Complement | 补码减1 |
| 移码 | Excess Code | 补码符号位取反 |
| 浮点数 | Floating Point | 小数点位置可浮动 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 四种编码的转换关系
> 2. 定点数和浮点数的表示
> 3. 浮点数加减运算流程
> 4. IEEE 754标准格式
---
## 🧪 例题与解析
### 例题1补码计算
**题目**计算8位补码的表示范围并求-5的补码。
**答案**
8位补码范围-2⁷=-128到2⁷-1=127即-128~127。
-5的补码5的二进制00000101取反11111010加1得11111011。
这就像一个8位的时钟范围-128到127-5的补码是时钟倒退5小时。
### 例题2浮点数表示
**题目**:将十进制数-0.75表示为IEEE 754单精度浮点数。
**答案**
0.75=0.11(二进制)-0.75=-0.11,规格化-1.1×2⁻¹。
符号位1负数阶码-1+127=126=01111110尾数10000000000000000000000。
完整表示1 01111110 10000000000000000000000。
### 例题3补码加法
**题目**:用补码计算 5 + (-3)。
**答案**
5的补码00000101-3的补码11111101相加
```
00000101
+ 11111101
-----------
1 00000010
```
补码结果00000010真值+2。5+(-3)=2✓
### 例题4浮点数加法
**题目**:计算 1.01 × 2² + 1.10 × 2¹。
**答案**
对阶1.10×2¹=0.110×
尾数运算1.010+0.110=10.000
规格化10.000×2²=1.000×2³=8
验证1.01×2²=51.10×2¹=35+3=8✓
### 例题5溢出判断
**题目**判断8位补码运算 127 + 1 是否溢出。
**答案**
127的补码011111111的补码00000001相加得10000000。
两个正数相加结果为负数10000000是-128的补码发生正溢出。
真正结果128实际结果-128溢出。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**四种编码速记**:原码(符号+绝对值,零有两种)、补码(正代负,零唯一,运算最简单)、反码(补码-1过渡用、移码补码符号取反便于比较大小
**正数**:原码=反码=补码。**负数**:补码=反码+1。口诀正数不变负数取反加1。
**补码范围**n位-2^(n-1) ~ +(2^(n-1)-1)。8位补码-128~127。-128没有对应原码
**补码加减运算**:加法直接加,减法变补码后加。溢出判断:两个正数相加得负数(正溢出),两个负数相加得正数(负溢出)。
**定点数**:小数点位置固定。定点整数(小数点在末尾)、定点小数(小数点在符号位后)。
**浮点数 = 尾数 × 2^阶码**类似科学计数法。规格化尾数最高位为1左规尾数左移阶码减1右规尾数右移阶码加1。
**IEEE 754单精度32位**1位符号 + 8位阶码移码偏移127+ 23位尾数。阶码全0和全1有特殊含义。
**浮点加减五步**:对阶(小阶向大阶看齐)→ 尾数运算 → 规格化 → 舍入 → 溢出判断。
**移位运算**:算术左移=×2算术右移=÷2。逻辑移位补0算术移位保持符号位。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[05_输入输出系统]] - 上一章
- [[07_指令系统]] - 下一章
- [[08_CPU结构与功能]] - CPU相关内容
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 重点*