原码,反码和补码
2012-06-02 21:24
459 查看
原码 true code
原码很简单,一个10进制正数通过除2法转换成的2进制数就是原码。比如8的原码是:1000
反码 complement,bitwise NOT
也很简单,就是翻转每个bit。比如:NOT 0111 (decimal 7)
= 1000 (decimal 8)
C/C++语言中,用~运算符就可以得到反码。
One's complement
这是一种对有符号整数的计算机内部二进制表示方法,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,忽略溢出。
就是在one'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 (高位不足计算机里面用符号位补足)
两者结果相同。
现在看一下负数-128,这是单字节无符号整数的最小值。用two's complement表示为1000 0000。 -127可以根据上面-7的方法计算,但是-128由于受7位数据未的限制,不能直接按照two's complement方法计算,需要变通一下。
下面是计算过程
-128 = (-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
然后就可以记住几个规律:1. 任何无符号整数的最小值都是 1开头后面跟若干个0
2. 任何无符号整数的取值范围都是负数的数量=正数的数量 + 1,1是0的数量,因此单字节的取值范围是[-128,127]