在十进制中,我们使用正负号(+ 或 -)直接表示一个数的符号,例如 +5 和 -5。但在二进制中,计算机只能存储 0 和 1,因此需要一种特殊的编码方式来表示负数。
原码(Sign-Magnitude) 是最直观的负数表示方法:
0 表示正数,1 表示负数。示例(以 8 位二进制为例):
+5 的原码:00000101(最高位 0 表示正,后7位 0000101 是5的二进制)-5 的原码:10000101(最高位 1 表示负,后7位 0000101 仍是5的二进制)虽然原码直观,但它存在两个主要问题:
零的表示不唯一:
+0:00000000-0:10000000加减运算复杂:
原码的加减法需要区分符号位和数值部分,硬件实现效率低。例如:
5 + (-3) 不能直接相加,必须先比较绝对值大小,再调整符号,增加了计算复杂度。由于这些缺陷,计算机通常采用更高效的 补码(Two's Complement) 表示负数(见下一节)。但原码仍然是理解负数表示的基础概念之一。
反码(Ones' Complement)是对原码的一种改进,旨在简化负数的表示和运算。它的核心思想是通过按位取反来表示负数,从而避免原码在加减法中的复杂符号处理。
0,其余位表示数值。
+5 在 8 位二进制中:0→1,1→0),包括符号位。
-5 的反码计算步骤:
+5 的原码:0000010111111010-5 的反码为 11111010。相对于原码,反码有一些独特的特点:
零的表示仍不唯一:+0:00000000 / -0:11111111
加减法运算的改进:
反码的加减法可以通过循环进位(End-Around Carry)实现:直接按位相加,若最高位产生进位,需将进位加回到结果的最低位。
5 + (-3)(8 位反码):
+5:00000101 (5 的反码) / -3:11111100(3 的反码)00000101 + 11111100 = (1)00000001,将进位 1 加回最低位:00000001 + 1 = 00000010(即 +2)。硬件实现简化:
反码的取反操作仅需简单的逻辑门电路(NOT 门),比原码的符号判断更高效。
补码(Two's Complement)是现代计算机系统中表示负整数的标准方式,它解决了原码和反码的缺陷(零的冗余表示和运算复杂性),同时提供了统一的加减法运算规则。
补码的定义
0,其余位表示数值。
+5 在 8 位补码中:补码的定义
2. 负数的补码(以 -5 为例):
0)。——+5 原码:0000010111111010(反码)1(忽略最高位的进位)。——加 1:11111011(补码)快速计算:从右向左找到第一个 1,保留该 1 及其右侧所有位,左侧全部取反。
-5 的补码:00000101 -> 11111011(第一个 1 在最低位)补码的特性
唯一表示零:
+0 和 -0 的补码均为 00000000,解决了原码和反码的冗余问题。符号位参与运算:
-128(10000000)到 +127(01111111)。补码的特性
3. 加减法统一:
5 - 3(相当于 5 + (-3)):
5 的补码:00000101-3 的补码:11111101补码的优势
-2^{N-1} 到 2^{N-1}-1,比原码和反码多一个负数(如 8 位补码的 -128)。0 或 1),而原码和反码则需要复杂的符号处理。1111 1101(-3)扩展到 16 位,结果直接为 1111 1111 1111 1101。补码的数学原理
补码的本质是模运算。对于 N 位二进制,补码表示的数 x 满足:
例如,-3 的 8 位补码 11111101 对应无符号数 253,因为:
这种同余关系使得加减法在模意义下自然成立。
补码因其运算统一性、零的唯一性和硬件高效性,成为现代计算机的整数表示标准。理解补码是掌握计算机算术的基础,尤其在底层编程(如嵌入式系统)中至关重要。
计算机系统中,小数的二进制表示主要有两种方法:定点数和浮点数。它们各有优缺点,适用于不同的计算场景。
定义:
预先约定小数点的固定位置,将整数部分和小数部分分别用固定长度的二进制位表示。
核心特点:
16.8 格式表示 16 位整数 + 8 位小数。示例(假设 8 位二进制,其中高 4 位为整数,低 4 位为小数):
0011 1100 → 整数部分 0011(3),小数部分 1100(0.75)→ 值:3.751/16(因 2^4=16)。优缺点:
0.0001 和 100000.0)。定义:
基于科学计数法,用 符号位(S) + 指数位(E) + 尾数位(M) 动态表示小数点的位置。
标准格式(以 IEEE 754 为例):
| 类型 | 总位数 | 符号位(S) | 指数位(E) | 尾数位(M) |
|---|---|---|---|---|
| 单精度浮点 | 32-bit | 1-bit | 8-bit | 23-bit |
| 双精度浮点 | 64-bit | 1-bit | 11-bit | 52-bit |
数值计算:
127(单精度)或 1023(双精度),用于支持负指数。1:尾数部分实际为 1.M(规范化数)。优缺点:
0.1 无法被浮点数所精确表示)、存在舍入误差。| 特性 | 定点数 | 浮点数 |
|---|---|---|
| 动态范围 | 小(固定小数点) | 大(指数动态调整) |
| 精度 | 固定(取决于小数位长度) | 可变(尾数位有限) |
| 硬件成本 | 低(直接整数运算) | 高(专用浮点运算单元) |
| 适用场景 | 财务计算、嵌入式系统 | 科学计算、图形处理 |
大部分 ASIC 设计中,我们使用定点数来表示小数,因为它们的硬件实现简单且高效。本次 Project 中,我们也将使用定点数来表示小数。
定义
定点数(Fixed-Point Number)通过固定小数点的位置来表示实数。其格式通常定义为 Qm.n,其中:
m:整数部分的二进制位数(包括符号位)n:小数部分的二进制位数编码规则
0 到 2^m - 2^-n-2^(m-1) 到 2^(m-1) - 2^-n2^-n示例(Q3.5 格式,8位):
01011010:
010(2)11010(0.8125)2.812500000001 → 0.03125(2^-5)运算规则
Qm.n 格式。m+n 位表示范围,需扩展位数或饱和处理。示例(Q3.5 格式):
2.5(01010000) + 1.25(00101000): 01010000 (2.5)
+ 00101000 (1.25)
—————————————————
01111000 (3.75)
4.0 + 4.0),会触发溢出。注意事项:
运算规则
示例(Q3.5 有符号数):
2.5(01010000) - 1.25(00101000):
1.25 的补码:11011000(-1.25) 01010000 (2.5)
+ 11011000 (-1.25)
—————————————————
00101000 (1.25)(忽略进位)
特殊情况:
运算规则
m+n 位数相乘,结果为 2(m+n) 位。m+n 位结果时需处理小数点位:
2n,需右移 n 位对齐格式。示例(Q3.5 无符号数):
1.5(00110000) × 2.0(01000000):
00110000 × 01000000 = 0000110000000000 (48)
0000110000000000 → 00001100000(3.0)48 × 2^-5 = 1.5(需修正为 3.0,此处示例需调整解释)优化方法:
a × b ≈ (a × b) >> n)。Q(m+k).(n+k) 格式。0111...1 或 1000...0)。0.5 后截断)Implement Fixed-Point Arithmetic in Python
请尝试在 Python 中实现一个简单的定点数类,支持加法、减法和乘法运算。
Try to implement a simple fixed-point multiplier in Logisim
请尝试在 Logisim 中实现一个简单的定点数乘法器,支持 Q8.8 格式的乘法运算。
Optional Themes: ShanghaiTech_Tutorial / NaiLoong / QYGG