[数字逻辑]有符号二进制数的编码表示

发布于 2022-08-30  459 次阅读


在计算机中,所有数字都用0/1二进制表示,编码一般分为“原码、反码、补码”三种。

正数

正数的原码、反码、补码都一样,对于纯小数也一样。

比如 \(5 = (101)_{2}\)

  • 原码:\((101)_{2}\)
  • 反码:\((101)_{2}\)
  • 补码:\((101)_{2}\)

比如 \(0.25 = (0010)_{2}\)

  • 原码:\((0010)_{2}\)
  • 反码:\((0010)_{2}\)
  • 补码:\((0010)_{2}\)

负数

负数在进行反码和补码操作时,都与“符号位无关”,反码是除符号位外所有位取反,补码等于反码+1(进位时到符号位截断,也无需考虑进位到符号位,只有-0会出现这种奇葩现象)。

在计算机中,负数都用补码存储,其实正数也是用补码存储的,但是正数的补码和原码一样。

比如\(-2 = (10000010)_{2}\)

  • 原码:\((10000010)_{2}\)
  • 反码:\((11111101)_{2}\)
  • 补码:\((11111110)_{2}\)

比如\(-0.25 = (1010)_{2}\)

  • 原码:\((1010)_{2}\)
  • 反码:\((1101)_{2}\)(注意取反码时符号位不动)
  • 补码:\((1110)_{2}\)(负数的补码 = 反码 + 1

加减法运算

\(N1 + N2 = [N1]_{补} + [N2]_{补} = [N1 + N2]_{补}\)

\(N1 - N2 = [N1]_{补} - [N2]_{补} = [N1 - N2]_{补}\)

使用补码计算\(N1 + N2\)时,首先分别求出两者的补码,然后将补码相加(符号位当做普通位数参与运算),得到的结果就是求和结果,符号位是1就是负数,是0就是正数

使用补码计算\(N1 - N2 = N1 + (-N2)\),可以将减法转换成加法计算。

当计算过程中出现进位溢出时,直接将溢出部分截断,这是计算规则。

比如\(5 - 2 = 5 + (-3)\)的计算过程如下:

5-2的补码运算

关于补码应该知道的

  1. 计算机中所有的数字(不论正数、负数,还是整数、浮点)都用补码储存
  2. 用补码计算免去了对符号的判断,比原码计算更快更方便。
  3. 正数的反码、补码和原码一样。
  4. 负数的补码 = 反码 + 1
  5. 补码的原理是利用数据溢出。