授课语音

二进制的补码和反码表示法

二进制表示法是计算机中表示数值的核心方式,尤其是在表示有符号整数时,常见的表示法有原码反码补码。其中,补码反码是处理负数时最常用的两种方法。补码是现代计算机中普遍采用的方式,具有简化加法和减法运算的优点。


一、原码(Sign-Magnitude)表示法

在介绍补码和反码之前,首先了解一下原码表示法。原码是最简单的二进制表示方法,符号位使用最高位(最左边的一位)来表示符号,0表示正数,1表示负数,其余位表示数值大小。

  • 正数的原码与其绝对值的二进制表示相同。
  • 负数的原码最高位为1,其余位表示其绝对值的二进制表示。

例子:

  • 8位的原码表示
    • 正数 500000101 (符号位 0 表示正数,剩余部分表示数值 5
    • 负数 -510000101 (符号位 1 表示负数,剩余部分表示数值 5

原码有一个问题:加减法运算比较复杂,因为对于负数的加法和减法需要分别处理符号和数值部分。


二、反码(Ones' Complement)表示法

反码表示法解决了原码中的一些问题。反码的表示方式是:

  • 正数的反码与原码相同。
  • 负数的反码是对其原码中的每一位进行取反,即符号位不变,其余位取反。

1. 反码表示法的规则

  • 正数:反码和原码相同。
  • 负数:将原码除符号位外的所有位取反,得到负数的反码。

例子:

  • 8 位的反码表示
    • 正数 5:原码是 00000101,反码也是 00000101
    • 负数 -5
      • 原码:10000101
      • 反码:11111010(将原码中除符号位外的每一位取反)

2. 反码运算

  • 反码的加法仍然有进位问题。特别是在表示负数时,两个负数的加法容易产生溢出,因此计算不如补码方便。

三、补码(Two's Complement)表示法

补码是现代计算机中最常用的表示方法,它比原码和反码更具优越性。补码的计算方式是:

  • 正数的补码与原码相同。
  • 负数的补码是对其绝对值的二进制表示取反后,再加上 1

补码的优势在于,加法和减法运算可以统一处理,不用考虑符号位。

1. 补码表示法的规则

  • 正数的补码与原码相同。
  • 负数的补码为:
    1. 取该数的原码。
    2. 对原码取反。
    3. 在取反后的结果上加 1

例子:

  • 8 位的补码表示
    • 正数 5
      • 原码:00000101
      • 补码:00000101(与原码相同)
    • 负数 -5
      • 原码:10000101
      • 反码:11111010(原码取反)
      • 补码:11111011(反码加1)

2. 补码的加法与减法

  • 加法:在补码中,正数与负数的加法可以直接进行,不需要考虑符号位。
  • 减法:减法也可以通过将被减数的补码加到减数上来实现。

3. 补码的范围

  • n 位补码可以表示的整数范围是:-2^(n-1)2^(n-1) - 1
    • 例如,8 位补码的范围是:-128127
    • 16 位补码的范围是:-3276832767

例子:

  • 8 位补码
    • 最大正数:01111111,表示 127
    • 最小负数:10000000,表示 -128
    • 最大负数:11111111,表示 -1

四、补码、反码与原码的比较

特性 原码 反码 补码
表示正数 与原码相同 与原码相同 与原码相同
表示负数 符号位为1,其他位为正数的原码 符号位为1,其他位为原码的反码 符号位为1,其他位为原码的反码+1
0的表示 正负零表示都存在 正负零表示都存在 只有一个零表示 (00000000)
加法运算 需要特殊处理符号位和进位 需要处理进位和符号位 加法运算简单,无需处理符号位
减法运算 需要转换为加法(加负数) 需要转换为加法(加负数) 直接加上补码即可
溢出检测 需要检查符号位的溢出 需要检查符号位的溢出 溢出检测简单

五、总结

  • 原码反码补码是三种常见的有符号数表示法。
  • 补码是计算机中最常用的表示法,因为它简化了加法和减法的运算。
  • 反码原码在表示负数时需要特别处理符号位和进位,计算比较麻烦。
  • 在现代计算机中,大多数运算,特别是加法和减法,都是使用补码来进行处理的。
去1:1私密咨询

系列课程: