您的位置:首页 > 其它

原码,反码和补码

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  system table 算法 语言