一、数值编码方式详解
1.1 原码(Sign-Magnitude)
- 定义:用最高位表示符号(0 正,1 负),其余位表示绝对值。
- 例子(8 位):
+5
:0000 0101
-5
:1000 0101
- 特点:
- 优点:直观,适合人类阅读。
- 缺点:
- 0 有两种表示(
+0
和-0
)。 - 加减运算复杂(需判断符号位)。
- 0 有两种表示(
1.2 反码(Ones' Complement)
- 定义:
- 正数:与原码相同。
- 负数:符号位保持 1,其他位按位取反。
- 例子(8 位):
+5
:0000 0101
-5
:1111 1010
- 特点:
- 优点:减法可通过加法完成(需处理循环进位)。
- 缺点:仍需处理双 0 问题。
1.3 补码(Two's Complement)
- 定义:
- 正数:与原码相同。
- 负数:反码加 1。
- 例子(8 位):
+5
:0000 0101
-5
:1111 1011
- 特点:
- 优点:
- 0 唯一表示(
0000 0000
)。 - 加减法统一(无需处理符号位)。
- 0 唯一表示(
- 表示范围:
-2^{n-1}
到2^{n-1}-1
(n 为位数)。 例如:8 位补码范围为-128 ~ +127
。
- 优点:
1.4 移码(Excess-K)
- 定义:用于浮点数指数部分的编码方式,公式为
移码 = 真值 + K
(固定偏移 K=2^{n-1})。 - 例子(8 位,K=128):
0
→1000 0000
-128
→0000 0000
+127
→1111 1111
- 特点:
- 优点:指数范围对称,方便比较大小。
1.5 编码转换关系
真值 | 原码 | 反码 | 补码 | 移码(K=128) |
---|---|---|---|---|
+5 | 0000 0101 | 0000 0101 | 0000 0101 | 1000 0101 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 | 0111 1011 |
二、逻辑门与电路组成
2.1 基本逻辑门
(1) 与门(AND Gate)
- 函数式:
Y = A·B
- 真值表:
A | B | Y 0 | 0 | 0 0 | 1 | 0 1 | 0 | 0 1 | 1 | 1
- 电路符号:
A ----|& |---- Y B ----|______|
(2) 或门(OR Gate)
- 函数式:
Y = A+B
- 真值表:
A | B | Y 0 | 0 | 0 0 | 1 | 1 1 | 0 | 1 1 | 1 | 1
- 电路符号:
A ----|>=1 |---- Y B ----|______|
(3) 非门(NOT Gate)
- 函数式:
Y = A'
- 真值表:
A | Y 0 | 1 1 | 0
- 电路符号:
A ----|>o |---- Y
(4) 异或门(XOR Gate)
- 函数式:
Y = A⊕B = A·B' + A'·B
- 真值表:
A | B | Y 0 | 0 | 0 0 | 1 | 1 1 | 0 | 1 1 | 1 | 0
- 电路符号:
A ----|=1 |---- Y B ----|______|
(5) 与非门(NAND Gate)
- 函数式:
Y = (A·B)'
- 电路符号:
A ----|& |----o Y B ----|______|
2.2 组合逻辑电路
(1) 半加器(Half Adder)
- 功能:计算 1 位加法(无进位输入)。
- 输入:
A
(加数)、B
(被加数)。 - 输出:
Sum
(和)、Carry
(进位)。 - 电路实现:
Sum = A⊕B
Carry = A·B
(2) 全加器(Full Adder)
- 功能:计算 1 位加法(考虑进位输入)。
- 输入:
A
,B
,Cin
(进位输入)。 - 输出:
Sum
,Cout
(进位输出)。 - 电路实现:
Sum = A⊕B⊕Cin
Cout = (A·B) + (A·Cin) + (B·Cin)
(3) 4 位行波进位加法器
- 组成:4 个全加器串联。
- 原理: 每位全加器的
Cout
连接到下一位的Cin
。 - 缺点: 进位延迟高,速度慢。
(4) 超前进位加法器(CLA)
- 原理: 通过并行计算所有进位位,减少延迟。
- 公式:
C1 = A0·B0 + (A0⊕B0)·C0 C2 = A1·B1 + (A1⊕B1)·C1 ...
2.3 乘法器与除法器
(1) 乘法器
- 实现:通过重复加法与移位。
- Booth 算法:
- 用于补码乘法,减少运算步骤。
- 规则:根据相邻位的差值(0→0,0→1,1→0,1→1)决定加减操作。
(2) 除法器
- 恢复余数法: 反复试探减去除数,若结果负则恢复余数。
- 不恢复余数法(Goldschmidt 算法): 通过调整余数直接计算商。
三、定点数(Fixed-Point Number)
3.1 定义与编码
(1) 纯小数定点数
- 格式:最高位为符号位,剩余为小数位。
- 例子(8 位):
0.1011
→0 1011000
(假设后 4 位补零)。 - 范围:
−(1−2^{-(n−1)})
到+(1−2^{-(n−1)})
(n 位表示)。
(2) 整数定点数
- 格式:最高位为符号位,剩余为整数位。
- 例子(8 位):
+5
→0000 0101
,-5
→
四、浮点数(Floating-Point Number)
4.1 浮点数的基本结构
浮点数通过 科学计数法 表示数值,分为三部分:
- 符号位(S):1 位,0 表示正,1 表示负。
- 指数(E):移码表示的整数,常用偏移量为
2^(k-1)-1
(如单精度 k=8,偏移量 127)。 - 尾数(M):隐含一个前导 1 的二进制小数(规格化形式)。
4.2 IEEE 754 标准详解
(1) 单精度浮点数(32 位)
- 结构:
S (1位) | E (8位) | M (23位)
- 指数偏移量:127(
E_true = E_stored - 127
)。 - 尾数:实际值为
1.M
(隐含前导 1)。 - 范围:
- 最大正数:
≈±3.4×10^38
- 最小正数(规格化):
≈±1.2×10^-38
- 最大正数:
(2) 双精度浮点数(64 位)
- 结构:
S (1位) | E (11位) | M (52位)
- 指数偏移量:1023(
E_true = E_stored - 1023
)。 - 范围:
- 最大正数:
≈±1.8×10^308
- 最小正数(规格化):
≈±2.2×10^-308
- 最大正数:
4.3 浮点数的特殊表示
(1) 规约数(Normalized Numbers)
- 条件:指数场不全为 0 且不全为 1。
- 尾数:隐含前导 1,实际值为
1.M
。 - 计算公式:math
Value = (-1)^S × (1.M_2) × 2^{(E-偏移量)}
(2) 非规约数(Denormalized Numbers)
- 条件:指数场全为 0。
- 尾数:无隐含前导 1,实际值为
0.M
。 - 计算公式:math
Value = (-1)^S × (0.M_2) × 2^{(1-偏移量)}
- 用途:填补接近 0 的数值区间,避免突然下溢为 0。
(3) 特殊值
- 无穷大(Infinity):
- 指数全 1,尾数全 0。表示溢出结果(如
1.0/0.0
)。
- 指数全 1,尾数全 0。表示溢出结果(如
- NaN(Not a Number):
- 指数全 1,尾数非 0。表示无效运算(如
√-1
或0/0
)。
- 指数全 1,尾数非 0。表示无效运算(如
4.4 浮点数的计算流程(以加法为例)
对阶:调整小阶数向大阶数对齐。
- 例如:
1.011×2^3 + 1.110×2^1 → 1.011×2^3 + 0.0111×2^3
- 例如:
尾数相加:对阶后的尾数直接相加。
- 结果:
1.011 + 0.0111 = 1.1101 → 1.1101×2^3
- 结果:
规格化:
- 若结果溢出(如
10.110×2^3
),右移尾数并调整指数。 - 若结果不足(如
0.1110×2^3
),左移尾数并减小指数。
- 若结果溢出(如
舍入处理:根据模式(向最近、向零等)调整尾数。
判断溢出:检查最终指数是否超出范围。
4.5 浮点数的精度问题
- 舍入误差:尾数位数有限导致的精度丢失。
- 例如:
0.1
在二进制中无限循环,转换为浮点数将产生误差。
- 例如:
- 大数吃小数:在加法中,两个数量级差异过大的数相加时,小数可能被忽略。