`
阿尔萨斯
  • 浏览: 4148726 次
社区版块
存档分类
最新评论

原码,反码和补码

 
阅读更多

原码 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,忽略溢出。

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 (高位不足计算机里面用符号位补足)


两者结果相同。











分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics