在计算机系统中,负数的二进制表示主要通过 补码(Two's Complement) 实现。补码的设计目的是为了简化计算机的算术运算(尤其是加减法),并统一处理正数和负数。以下是关键步骤和原理:
1. 原码(Sign-Magnitude)
最简单的表示方法:
- 最高位为符号位(0 表示正数,1 表示负数),其余位表示绝对值。
- 例如,8 位二进制中:
+5→00000101-5→10000101
- 缺点:
- 存在
+0(00000000)和-0(10000000)两种零,导致逻辑复杂。 - 加减法需要单独处理符号位,硬件实现复杂。
- 存在
2. 反码(One's Complement)
- 负数的反码:符号位保持为 1,数值位逐位取反。
- 例如:
+5→00000101-5→11111010
- 缺点:
- 同样存在
+0和-0的问题。 - 加减法仍需处理进位问题(例如
-5 + 5需要额外补 1)。
- 同样存在
3. 补码(Two's Complement)(现代计算机使用)
- 补码的生成规则:
- 正数的补码 = 原码。
- 负数的补码 = 反码 + 1(即原码取反后加 1)。
- 示例(8 位二进制):
+5→00000101-5:- 原码:
10000101 - 反码:
11111010 - 补码:
11111011
- 原码:
- 优点:
- 统一了正负数的加减法运算(直接使用加法器即可完成)。
- 消除了
+0和-0的冗余(唯一表示00000000)。 - 符号位直接参与运算,无需特殊处理。
4. 补码的特性
- 范围:对于
n位二进制,补码可表示的范围为:- 正数:
0到2^(n-1) - 1 - 负数:
-1到-2^(n-1) - 例如,8 位补码范围是
-128(10000000)到+127(01111111)。
- 正数:
- 快速判断负数:最高位为 1 时是负数,为 0 时是正数。
- 补码的补码是原数:对补码再次取补码,可以得到原数。
5. 补码运算示例
- 计算
5 - 3:5→00000101-3→11111101(补码形式)- 相加:
00000101 + 11111101 = 1 00000010(溢出位舍弃) - 结果:
00000010(即+2)。
6. 其他表示方法
- 移码(Excess-K):主要用于浮点数的指数部分,将数值整体偏移一个固定值(例如
K=127用于 32 位浮点数)。 - BCD 码:直接对十进制数字编码,但一般不用于负数表示。
总结
现代操作系统和计算机统一使用 补码 表示负数,因为它完美解决了原码和反码的缺陷,简化了硬件设计,并保证了运算的高效性。