LSB answer演示了整数的This求反。当使用负(有符号)整数时,这种方法不会产生预期的结果。让我们看一些代码:
a = 4
print()
print("a: " + str(a))
print("binary version of a: " + bin(a))
a = a | 1
print("binary version of a after negation of LSB: " + bin(a))
print("a after negation of LSB: " + str(a))
print()
b = 5
print("b: " + str(b))
print("binary version of b: " + bin(b))
b = b & ~1
print("binary version of b after negation of LSB: " + bin(b))
print("b after negation of LSB: " + str(b))
print()
c = -4
print("c: " + str(c))
print("binary version of c: " + bin(c))
c = c | 1
print("binary version of c after negation of LSB: " + bin(c))
print("c after negation of LSB: " + str(c))
print()
d = -5
print("d: " + str(d))
print("binary version of d: " + bin(d))
d = d & ~1
print("binary version of d after negation of LSB: " + bin(d))
print("d after negation of LSB: " + str(d))取反后c的期望值是-5,而不是-3。类似地,取反后d的期望值是-4,而不是-6。为什么c和d的实际值与预期值不匹配?
发布于 2021-06-22 22:22:29
我认为这里的问题是python将负数存储为两个数的补码,但不会以这种方式打印出来。让事情变得非常混乱!这篇文章是here goes into more detail about it的,但是我们可以通过一个简单的例子来看看发生了什么:
二进制是-4 \f25 0b11111100 -4\f6(-4\f25 4-4\f6的二进制补码)
1是正数,所以在二进制中它只是0b00000001
当你或这两个人在一起时,你会得到:
0b11111101,它是-3的二进制表示法(二进制补码)
我used this site来找两个的补码,值得注意的是,python整数是32位而不是8位,所以在负数/2的补数前面有24个额外的1,在正数前面有24个额外的0(只要两者都低于abs(255))
https://stackoverflow.com/questions/68085086
复制相似问题