原码、反码、补码

全篇以一字节(8位)为例

机器数和真值

机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,最高位存放符号, 正数为0, 负数为1。如数5-5(十进制)分别转换成8位二进制为0000 010110000101

真值:将带符号位的机器数对应的真正数值称为机器数的真值。如有符号数10000101真正数值为-5,而不是133

原码

定义:最高位为符号位,1 表示负数,0 表示正数。其余比特位表示值。

  • +5[原码]: 0000 0101

  • -5[原码]: 1000 0101

存在问题

负数计算出错

使用原码计算5-3

假设我们要计算 (5 - 3) 的原码表示。

  1. 表示数字

    • (5) 的原码是 0000 0101(正数)。
    • (3) 的原码是 0000 0011(正数)。
  2. 取负数

  • ( -3 ) 的原码是 1000 0011(负数)。
  1. 计算

       0000 0101
    + 1000 0011
    ---------------
    1000 1000
  2. 结果分析

    • 结果 1000 1000 表示负数,得到的真值是 -8。结果不正确,原码在减法操作中的复杂性和易出错性。

零不唯一

在原码表示中,零的表示确实是不唯一的。

  1. 正零

    • 正零的原码表示为 0000 0000(最高位为0)。
  2. 负零

    • 负零的原码表示为 1000 0000(最高位为1)。

反码

正数的反码与原码相同,而负数的反码是对原码中数值位每一位进行取反

  • +5 [反码]:00000101(与原码相同)
  • -5 [反码]:
    • 原码: 10000101
    • 反码: 11111010(数值部分每位取反)

反码计算

1.反码运算时,其符号位与数值一起参加运算。

2.反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)。

3.用反码运算,其运算结果亦为反码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求反才是其真值。

  0000 0101  (5)
+ 1111 1100 (-3的反码)
---------------
10000 0001--->0000 0001----进位加到最低位-->0000 0010

0000 0010的真值为2,结果正确

问题

零不唯一

反码有正零(0000000000000000 )和负零(1111111111111111)两个表示

加法复杂性

在反码加法中,必须处理进位和符号位,增加了运算的复杂性。

补码

正数的补码和它的原码相同,负数的补码 = 数值位逐位求反(反码) + 1 (+1是在最后的位置加一,即使是小数的最后位置)

补码的第一位不仅代表符号位,还代表了权值

  • +5[补码]= 0000 0101

  • -5[补码]:

    • 原码: 10000101
    • 反码: 11111010(数值部分每位取反)
    • 补码: 1111 1011 (反码+1)

例:小数的补码

  1. 正数 5.625 的二进制表示

    • 整数部分 5 = 101
  • 小数部分 0.625 = 0.101(通过反复乘以 2 得到)

所以,5.625 的原码为:101.101

  1. 表示为补码

    • 首先,正数 5.625 的原码为 00000101.101(假设使用 8 位整数部分和 3 位小数部分)。
    • 反码(对符号位不变,数值部分取反):
      • 整数部分取反:11111010.010
    • 补码(反码 + 1):
      • 11111010.010 + 0.001 = 11111010.011

    -5.625 的补码为 11111010.011

零唯一

零的表示是唯一的,即 0000 0000,正零和负零都用相同的表示,这样避免了反码中存在的两个零表示的问题

补码计算

计算 (5 - 3) 的补码方法如下:

  1. 表示 (5)

    • 原码:(0000 0101)
    • 补码:(0000 0101)
  2. 表示 (-3)

    • 原码:(1000 0011)

    • 反码:(1111 1100)

    • 补码:(1111 1101)(反码加 (1))

  3. 相加

      0000 0101  (5)
    + 1111 1101 (-3的反码)
    1 0000 0010 ----舍去进位---->0000 0010

结果是 (0000 0010),即 2,表示 5 - 3 = 2,结果正确。