什么是原码,反码(1’s Complement Code)和补码(2’s Complement Code)?

1,901 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

笔者在英文资料中见到1's Complement Code和2's Complement Code乍一看直译都是补码,按补码理解又搞的一头雾水,其实他们是有区别的。这篇文章帮你彻底理解什么是1's Complement Code和2's Complement Code

True Form原码,是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。为了便于ALU进行运算,又发展出反码、补码等转换过的码。特别的:正数的原码 = 反码 = 补码。引进补码的作用是为了让计算机更方便做减法。 补充: 二进制数的运算方法

Complement Code 的形式有2种:

  • 1's Complement Code 1的补码:常翻译为 反码。 多用在IP、TCP的checksum校验和中。 计算方法: - 正数的反码与原码相同 - 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
  • 2's Complement Code 2的补码:常翻译为 补码/二补码。 平时在计算机科学中学习的补码是2的补码,它最大的好处在于使得所有的加减法运算可以用同一种电路完成,即将 a - b转化为a + (-b),具体的解释、证明请参阅 关于2的补码。 计算方法: - 正数的补码和原码相同 - 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反再加1。

以-9(= 0b1000 1001)和 9(= 0b0000 1001)为例:

十进制表示-99
Sign-Magnitude 原码1000 10010000 1001
1's Complement Code 反码1111 01100000 1001
2's Complement Code 补码1111 01110000 1001

另:补码的最高有效位(MSB: Most Significant Bit)是符号位(Sign Bit),0代表正数,1代表负数,例如:对于一个4位的补码来说:0111是1(=0b0001)的补码,而1001则是-7(=0b1111)的补码

拓展阅读: 1的补码vs 2的补码 关于补码的由来和作用 二进制的原码、反码、补码