先看些例子:
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
所以说:
- Python 中的整型是补码形式存储的
- Python 中 bin 一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,方便查看(方便个鬼啊)
- Python 中 bin 一个负数(十六进制表示),输出的是对应的二进制表示。(注意此时)
这就出现了在Python里面需要将负数和0xffffffff进行与操作,来去掉负数前面的负号,可以理解为超过32位的东西就不进行考虑了,这进行与操作的具体步骤是:如果是正数,直接与;如果是负数,先去掉最前面的负号,再取反,再加1,再进行与操作。从而得到负数的补码。(可以用上面的-3-->-0b11-->0xff ff ff fd)
注意:
所以你为了获得负数(十进制表示)的补码,需要手动将其和十六进制数 0xfffffffd 进行按位与操作,得到结果也是个十六进制数,再交给 bin() 进行输出,得到的才是你想要的补码表示。
这与我们学计算机组成原理的的似乎有些不太一样,确实是这样的,这个对外行看了可能觉得比较好
但是对于计算机专业的人看了,反而会觉得很奇怪
C++和java语言中怎么存负数:
正数的原码,补码,反码都是一样的
负数则是符号位(一般是最高位)不变,剩余的位全部取反,最后在加1