原码 true code
原码很简单,一个10进制正数通过除2法转换成的2进制数就是原码。
比如8的原码是:1000
反码 complement,bitwise NOT
也很简单,就是翻转每个bit。比如:
NOT 0111 (decimal 7) = 1000 (decimal 8)
C/C++语言中,用~运算符就可以得到反码。
这是一种对有符号整数的计算机内部二进制表示方法,in short,正数相同,负数用反码。下面的例子来自wikipedia.
The table below shows all possible values in a 4-bit system, from −7 to +7.
+ - 0 0000 1111 Note that +0 and −0 return TRUE when tested for zero, FALSE when tested for non-zero. 1 0001 1110 2 0010 1101 3 0011 1100 4 0100 1011 5 0101 1010 6 0110 1001 7 0111 1000
该方法由于有些缺点,并不常用。
Two's complement
这是最常用的计算机表示有符号整数的方法。
遇到正数不变,遇到负数是将二进制求反加1,忽略溢出。
The table below shows all possible values in a 4-bit system, from −7 to +7.
+ - 0 0000 Note 0 has only one presentation:0000,no -0 1 0001 1111 2 0010 1110 3 0011 1101 4 0100 1100 5 0101 1011 6 0110 1010 7 0111 1001
这就是常说的补码。
补码
补码的逻辑算法是:(正数相同,符号位为0)
1.-7的数值部分(不包括符号) 表示成整数是111
2.加上符号1表示负数,因此是1111
3.只反转非符号位,因此是1000
4.加上1,因此是1001
现在看看计算机如何使用two's complement表示-7的算法。
1.7表示位00000111 (在计算机中数字至少占一个字节)
2.取反后,变成11111000
3.加1后,变成11111001 (高位不足计算机里面用符号位补足)
两者结果相同。