python中的原码反码和补码
原码反码和补码的概念
- 原码:原码是二进制数字的一种简单的表示法。二进制首位为符号位,1代表负,0代表正。
- 反码:反码可由原码得到。如果是正数,反码与原码相同;如果是负数,反码是其原码(符号位除外)各位取反而得到的。
- 补码:补码可由原码得到。如果是正数,补码与原码相同;如果是负数,补码是对其原码(除符号位外)各位取反,并在末位加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 中,情况是这样的:
- 整形是以 补码 形式存放的,输出的时候是按照 二进制 表示输出的;
- 对于 bin(x)(x为 十进制负数),输出的是它的原码的二进制表示加上一个负号,方便查看
- 对于 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