计算机中的数不是数学实数,而是:
有限位模式(bit pattern)
设字长为 n 位,则可表示状态数:
$$ 2^n $$
因此计算机数值空间本质为:
$$ \mathbb{Z}_{2^n} $$
即:
模 $2^n$ 整数环
编码的目标:
将数学整数映射为位模式。
| 编码 | 特点 | 运算特性 |
|---|---|---|
| 原码 | 符号位 + 数值位 | 加减需分情况 |
| 反码 | 负数按位取反 | 存在双零 |
| 补码 | 模环表示 | 运算统一 |
补码定义:
$$ -x \equiv 2^n - x $$
意义:
负数 = 模空间中的加法逆元
因此:
$$ X - Y = X + (-Y) $$
计算机无需减法器。
计算机整数运算本质:
$$ 结果 = 真值 \bmod 2^n $$
所有加减法统一为:
模加法
机器执行的是位操作,但对应数值意义。
位左移,低位补0:
$$ x \times 2 $$
(无符号)
最高位复制:
$$ \lfloor x / 2 \rfloor $$
(保持符号)
必须区分:
| 概念 | 含义 |
|---|---|
| 进位 | 超出位宽 |
| 溢出 | 数值语义错误 |
同号相加结果异号。
设:
则:
$$ Overflow = C_{in} \oplus C_{out} $$
$$ [X]{补} + [Y]{补} = [X+Y]_{补} \bmod 2^n $$
$$ X - Y = X + (-Y) $$
int tadd_ok(int x, int y) {
int sum = x + y;
int neg_over = x < 0 && y < 0 && sum >= 0;
int pos_over = x >= 0 && y >= 0 && sum < 0;
return !(neg_over || pos_over);
}
乘法目标:
$$ P = X \times Y $$
本质:
部分积累加
乘法算法
├ 串行乘法
│ ├ 原码乘法
│ ├ Booth乘法
│
├ 并行乘法
│ ├ 阵列乘法器
│ ├ Wallace tree
│
└ 高速乘法
核心思想:
逐位检查乘数:
符号位独立:
$$ Sign = Sign_X \oplus Sign_Y $$
部分积清零
重复 n 次:
若乘数最低位=1 → 加被乘数
右移
处理符号
动机:
减少加法次数。
检测位对:
| 当前位 | 前一位 | 操作 |
|---|---|---|
| 01 | +X | |
| 10 | -X | |
| 00 / 11 | 不变 |
目标:
$$ Q = X / Y $$
本质:
试商 + 修正
除法算法
├ 恢复除法
├ 不恢复除法
├ SRT除法
流程:
左移
减除数
若负 → 恢复 + 商0
否则 → 商1
若上次为负:
→ 加除数
否则:
→ 减除数
避免恢复步骤。
运算器 = 数据通路 + 控制通路
寄存器组
加法器 / ALU
移位器
部分积寄存器
乘数寄存器
计数器
控制:
实现:
有限状态机。
┌─────────┐
X ─────→│ 被乘数寄存器 │
└─────────┘
↓
┌─────────┐
│ ALU │
└─────────┘
↓
┌─────────┐
│ 部分积寄存器 │
└─────────┘
↓
移位器
机器执行的不是算法,而是:
微操作序列
例:
A ← 0
repeat n:
if Q0=1 → A ← A + X
(A,Q) 算术右移
| 设计维度 | 影响 |
|---|---|
| 位宽 | 延迟 |
| 并行度 | 面积 |
| 流水线 | 吞吐 |
| 算法复杂度 | 控制逻辑 |
串行加法器
→ 并行加法器
→ 乘法阵列
→ 流水线ALU
→ SIMD
→ 向量处理器
计算机算术的本质链:
数值编码
→ 模运算语义
→ 位级操作
→ 运算算法
→ 微操作序列
→ 数据通路
→ 控制逻辑
→ 运算器
→ 处理器执行
机器算术系统
├ 数值表示
│ ├ 原码
│ ├ 反码
│ └ 补码
│
├ 运算语义
│ ├ 模运算
│ ├ 移位语义
│ └ 溢出
│
├ 运算算法
│ ├ 加减
│ ├ 乘法
│ └ 除法
│
├ 运算器结构
│ ├ 数据通路
│ └ 控制通路
│
└ 工程实现
├ 微操作
├ 时序
└ 性能