原码(Sign-Magnitude Representation)
原码是最直观的表示方法,其中整数由一个符号位和其余位数值表示。具体规则如下:
- 最高位(最左边的位)是符号位:0 表示正数,1 表示负数。
- 其余位表示数值的绝对值。
例如,假设用一个 8 位的原码表示整数:
- +3 的原码是
00000011
。 - -3 的原码是
10000011
。
原码的优点是简单直观,但存在一个问题,即加法和减法需要单独的硬件电路来处理负数,这使得运算复杂化。
反码(One's Complement)
为了解决原码加减法的问题,引入了反码。反码的规则如下:
- 正数的反码与原码相同。
- 负数的反码是对应正数的每一位取反(0 变 1,1 变 0)得到的。
例如,对于 8 位表示:
- +3 的反码是
00000011
。 - -3 的反码是
11111100
。
反码的一个问题是存在两个零:正零和负零(全是 0 和全是 1 的情况),这增加了比较和运算的复杂性。
补码(Two's Complement)
补码是计算机中最常用的整数表示方法,它解决了反码的两个零的问题。补码的规则如下:
- 正数的补码与原码相同。
- 负数的补码是对应正数的反码加 1。
例如,对于 8 位表示:
- +3 的补码是
00000011
。 - -3 的补码是
11111101
(即11111100
(-3 的反码) + 1)。
补码的优点是在计算机中只需一个加法器即可同时处理正数和负数的加减法,简化了硬件设计和运算规则。
它们之间的关系如下:
-
原码与反码:
- 正数的原码和反码相同。
- 负数的反码是对应正数的各位取反。
- 原码和反码之间的转换简单,只需考虑符号位以外的位数。
-
反码与补码:
- 正数的反码和补码相同。
- 负数的补码是其反码加 1。
- 反码和补码之间的转换是对反码的末位加 1。
-
原码与补码:
- 正数的原码和补码相同。
- 负数的补码是对应正数的补码。
实例
假设我们使用 8 位表示整数,以示例说明:
-
原码转换为反码和补码:
- 原码
00000101
表示 +5。 - 反码与原码相同:
00000101
表示 +5。 - 补码与原码相同:
00000101
表示 +5。
- 原码
-
负数的原码、反码和补码:
- 原码
10000101
表示 -5。 - 反码:符号位不变,其余位取反得到
11111010
。 - 补码:对应正数的反码加 1,即
11111011
。
- 原码
-
加法操作:
- 计算 +3 和 -3 的补码表示:
- +3 的补码
00000011
。 - -3 的补码
11111101
。
- +3 的补码
- 加法操作:
00000011 + 11111101 = 00000000
(溢出时舍弃进位),结果的补码是00000000
,对应于 0。
- 计算 +3 和 -3 的补码表示:
总结:原码、反码和补码是计算机中表示有符号整数的三种方式,每种方式都有其优缺点,补码在实际中应用最为广泛,因为它简化了算术运算和硬件设计。