**原码(Sign-Magnitude)、反码(One’s Complement)和补码(Two’s Complement)**是计算机中表示有符号二进制数的三种方法。它们的设计目的是为了表示正数和负数,并支持二进制的加减法操作。以下是对这三种编码方式的详细介绍:
1. 原码(Sign-Magnitude)
(1)定义
原码是一种二进制编码方法,用于表示有符号整数。它通过最高位作为符号位,其余位表示数值的绝对值。
- 符号位:
- ( 0 ):正数。
- ( 1 ):负数。
- 数值位:用普通的二进制方式表示绝对值。
(2)表示方法
- 一个 ( n )-位二进制数的原码表示:
[
X = (-1)^{S} \cdot \text{Value}
]- ( S ):符号位(最高位)。
- ( \text{Value} ):绝对值的二进制表示。
示例(4 位表示):
- ( +5 ):( 0\ 101 )
- ( -5 ):( 1\ 101 )
- ( +7 ):( 0\ 111 )
- ( -7 ):( 1\ 111 )
(3)优点
- 表示简单,符号位和数值部分分离,容易理解。
(4)缺点
- 存在两个零:
- ( +0 ):( 0\ 000 )
- ( -0 ):( 1\ 000 )
- 不便于实现加减法运算:
- 加减法需要考虑符号位,逻辑复杂。
2. 反码(One’s Complement)
(1)定义
反码是将一个数的正数的二进制表示按位取反来表示负数。正数的反码与其原码相同,负数的反码则是将原码的数值位按位取反(0 → 1,1 → 0)。
- 符号位:
- ( 0 ):正数。
- ( 1 ):负数。
(2)表示方法
正数:反码 = 原码。
负数:反码 = 原码中数值部分按位取反。
示例(4 位表示):
- ( +5 ):( 0\ 101 )(与原码相同)
- ( -5 ):将 ( +5 ) 的数值部分按位取反:( 1\ 010 )
- ( +7 ):( 0\ 111 )(与原码相同)
- ( -7 ):将 ( +7 ) 的数值部分按位取反:( 1\ 000 )
(3)真值范围
对于 ( n )-位反码:
- 最小值:( -(2^{n-1} - 1) )
- 最大值:( 2^{n-1} - 1 )
示例(4 位表示):
- ( +7 ):( 0\ 111 )
- ( -7 ):( 1\ 000 )
(4)优点
- 适合加减法运算:
- 反码的加减法只需要进行位加法,但需注意进位规则。
(5)缺点
- 同样存在两个零:
- ( +0 ):( 0\ 000 )
- ( -0 ):( 1\ 111 )
- 需要处理进位和进位补偿。
3. 补码(Two’s Complement)
(1)定义
补码是当前计算机中广泛使用的二进制编码方法。它解决了反码的两个零问题,使加减法运算更加简单。
- 正数:补码 = 原码。
- 负数:补码 = 反码 + 1。
换句话说,负数的补码是对正数的二进制表示按位取反后再加 1。
(2)表示方法
正数:补码与原码相同。
负数:补码 = ((2^n) - |X| )(将数值从 ( 2^n ) 减去其绝对值)。
示例(4 位表示):
- ( +5 ):( 0\ 101 )(与原码相同)
- ( -5 ):将 ( +5 ) 的补码计算为:
- 按位取反:( 1\ 010 )
- 加 1:( 1\ 011 )
- ( +7 ):( 0\ 111 )
- ( -7 ):将 ( +7 ) 的补码计算为:
- 按位取反:( 1\ 000 )
- 加 1:( 1\ 001 )
(3)真值范围
对于 ( n )-位补码:
- 最小值:( -2^{n-1} )
- 最大值:( 2^{n-1} - 1 )
示例(4 位表示):
- 最小值:( -8 ):( 1\ 000 )
- 最大值:( +7 ):( 0\ 111 )
(4)优点
- 只有一个零:( 0\ 000 )。
- 加减法简单:直接使用位加法即可处理加法和减法,进位可以自然处理。
- 广泛应用:现代计算机中采用补码表示整数。
(5)缺点
- 人类理解上稍复杂:负数的表示需要计算补码。
4. 三者的对比
特性 | 原码 | 反码 | 补码 |
---|---|---|---|
符号位 | 最高位表示符号 | 最高位表示符号 | 最高位表示符号 |
正数表示 | 与普通二进制相同 | 与普通二进制相同 | 与普通二进制相同 |
负数表示 | 绝对值部分与正数相同,符号位为 1 | 正数按位取反 | 正数按位取反后加 1 |
存在的零 | 两个(+0 和 -0) | 两个(+0 和 -0) | 一个(0) |
加减法运算 | 逻辑复杂 | 需要考虑进位补偿 | 简单,直接位加法 |
范围 | (-2^{n-1}+1) 到 (2^{n-1}-1) | (-2^{n-1}+1) 到 (2^{n-1}-1) | (-2^{n-1}) 到 (2^{n-1}-1) |
优点 | 易于理解 | 比原码好,支持加减法 | 无二义零,适合加减法 |
缺点 | 运算复杂,两个零 | 进位补偿问题,两个零 | 难以理解,但逻辑简单 |
应用场景 | 早期计算机 | 特殊应用,已不常用 | 现代计算机主流方法 |
5. 计算实例
示例:计算 ( +5 + (-3) )(使用 4 位表示)
(1)原码
- ( +5 ):( 0\ 101 )
- ( -3 ):( 1\ 011 )
- 直接加法:( 0\ 101 + 1\ 011 = 10\ 000 )(溢出,需要手动调整)。
(2)反码
- ( +5 ):( 0\ 101 )
- ( -3 ):正数 ( 3 = 0\ 011 ),按位取反:( 1\ 100 )。
- 加法:( 0\ 101 + 1\ 100 = 10\ 001 )。
- 进位补偿:进位 1,加到低位,结果为:( 0\ 010 = 2 )。
(3)补码
- ( +5 ):( 0\ 101 )
- ( -3 ):正数 ( 3 = 0\ 011 ),按位取反后加 1:( 1\ 101 )。
- 加法:( 0\ 101 + 1\ 101 = 0\ 010 )。
- 结果正确:( +2 )。
6. 总结
- 原码:结构简单但不适合计算,早期使用。
- 反码:改进了负数表示,但仍存在两个零的问题。
- 补码:是最优的解决方案,简化了加减法操作,是现代计算机的主流方法。