python中的原码反码和补码

2021-05-29  本文已影响0人  wanzhouyi

python中的原码反码和补码

原码反码和补码的概念

  1. 原码:原码是二进制数字的一种简单的表示法。二进制首位为符号位,1代表负,0代表正。
  2. 反码:反码可由原码得到。如果是正数,反码与原码相同;如果是负数,反码是其原码(符号位除外)各位取反而得到的。
  3. 补码:补码可由原码得到。如果是正数,补码与原码相同;如果是负数,补码是对其原码(除符号位外)各位取反,并在末位加1而得到的(有进位则进位,但不改变符号位)。

更详细的介绍可参考这篇文章

原码反码和补码的示例

如下以8位二进制为例:

真值 原码 反码 补码 备注
2^7-1=127 0 1111111 0 1111111 0 1111111 正数的原码反码补码相同
+ 7 0 0000111 0 0000111 0 0000111 正数的原码反码补码相同
+ 1 0 0000001 0 0000001 0 0000001 正数的原码反码补码相同
0 0 0000000 0 0000000 0 0000000 正数的原码反码补码相同
- 1 1 0000001 1 1111110 1 1111111 负数的补码是符号位不变其余取反加 1
- 7 1 0000111 1 1111000 1 1111001 负数的补码是符号位不变其余取反加 1
−(2^7−1)=−127 1 1111111 1 0000000 1 0000001 负数的补码是符号位不变其余取反加 1

特殊地数字在计算机中用二进制补码形式表示,补码10000000表示的不是 -0,而是-128

python中的原码反码及补码

一般来讲,整形数在内存中是以 补码 的形式存放的,输出的时候同样也是按照 补码 输出的。

但是在 Python 中,情况是这样的:

  1. 整形是以 补码 形式存放的,输出的时候是按照 二进制 表示输出的;
  2. 对于 bin(x)(x为 十进制负数),输出的是它的原码的二进制表示加上一个负号,方便查看
  3. 对于 bin(x)(x 为 十六进制负数),输出的是对应的二进制表示。

所以为了获得十进制负数的补码,我们需要手动将其和 0xffffffff 进行与操作,得到一个十六进制数,再交给 bin() 转化,这时内存中得到的才是你想要的补码。

a = bin(-3)
print(a)

a = bin(3)
print(a)

b = bin(-3 & 0xffffffff)
print(b)

c = bin(0xfffffffd)
print(c)

# 输出
# -0b11
# 0b11
# 0b11111111111111111111111111111101
# 0b11111111111111111111111111111101
上一篇下一篇

猜你喜欢

热点阅读