Skip to content

一、数值编码方式详解

1.1 原码(Sign-Magnitude)

  • 定义:用最高位表示符号(0 正,1 负),其余位表示绝对值。
  • 例子(8 位):
    • +50000 0101
    • -51000 0101
  • 特点
    • 优点:直观,适合人类阅读。
    • 缺点
      • 0 有两种表示(+0-0)。
      • 加减运算复杂(需判断符号位)。

1.2 反码(Ones' Complement)

  • 定义
    • 正数:与原码相同。
    • 负数:符号位保持 1,其他位按位取反。
  • 例子(8 位):
    • +50000 0101
    • -51111 1010
  • 特点
    • 优点:减法可通过加法完成(需处理循环进位)。
    • 缺点:仍需处理双 0 问题。

1.3 补码(Two's Complement)

  • 定义
    • 正数:与原码相同。
    • 负数:反码加 1。
  • 例子(8 位):
    • +50000 0101
    • -51111 1011
  • 特点
    • 优点
      • 0 唯一表示(0000 0000)。
      • 加减法统一(无需处理符号位)。
    • 表示范围-2^{n-1}2^{n-1}-1(n 为位数)。 例如:8 位补码范围为 -128 ~ +127

1.4 移码(Excess-K)

  • 定义:用于浮点数指数部分的编码方式,公式为 移码 = 真值 + K(固定偏移 K=2^{n-1})。
  • 例子(8 位,K=128):
    • 01000 0000
    • -1280000 0000
    • +1271111 1111
  • 特点
    • 优点:指数范围对称,方便比较大小。

1.5 编码转换关系

真值原码反码补码移码(K=128)
+50000 01010000 01010000 01011000 0101
-51000 01011111 10101111 10110111 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 位加法(考虑进位输入)。
  • 输入ABCin(进位输入)。
  • 输出SumCout(进位输出)。
  • 电路实现
    • 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.10110 1011000(假设后 4 位补零)。
  • 范围−(1−2^{-(n−1)})+(1−2^{-(n−1)})(n 位表示)。

(2) 整数定点数

  • 格式:最高位为符号位,剩余为整数位。
  • 例子(8 位): +50000 0101-5

四、浮点数(Floating-Point Number)

4.1 浮点数的基本结构

浮点数通过 科学计数法 表示数值,分为三部分:

  1. 符号位(S):1 位,0 表示正,1 表示负。
  2. 指数(E):移码表示的整数,常用偏移量为 2^(k-1)-1(如单精度 k=8,偏移量 127)。
  3. 尾数(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)。
  • NaN(Not a Number)
    • 指数全 1,尾数非 0。表示无效运算(如 √-10/0)。

4.4 浮点数的计算流程(以加法为例)

  1. 对阶:调整小阶数向大阶数对齐。

    • 例如:1.011×2^3 + 1.110×2^1 → 1.011×2^3 + 0.0111×2^3
  2. 尾数相加:对阶后的尾数直接相加。

    • 结果:1.011 + 0.0111 = 1.1101 → 1.1101×2^3
  3. 规格化

    • 若结果溢出(如 10.110×2^3),右移尾数并调整指数。
    • 若结果不足(如 0.1110×2^3),左移尾数并减小指数。
  4. 舍入处理:根据模式(向最近、向零等)调整尾数。

  5. 判断溢出:检查最终指数是否超出范围。


4.5 浮点数的精度问题

  • 舍入误差:尾数位数有限导致的精度丢失。
    • 例如:0.1 在二进制中无限循环,转换为浮点数将产生误差。
  • 大数吃小数:在加法中,两个数量级差异过大的数相加时,小数可能被忽略。