笔者在英文资料中见到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)为例:
十进制表示 | -9 | 9 |
---|---|---|
Sign-Magnitude 原码 | 1000 1001 | 0000 1001 |
1’s Complement Code 反码 | 1111 0110 | 0000 1001 |
2’s Complement Code 补码 | 1111 0111 | 0000 1001 |
另:补码的最高有效位(MSB: Most Significant Bit)是符号位(Sign Bit),0代表正数,1代表负数,例如:对于一个4位的补码来说:1111是-1(=0b1001)的补码,而1001则是-7(=0b1111)的补码