我最近正在进行位移,并且想知道为什么在下面的iPython输出中,将值-1移位而移动值4294967295会产生不同的结果?
In [30]: val = -1
In [31]: print "hex x %d 0x%08X" % (val, val & 0xffffffff)
hex x -1 0xFFFFFFFF
In [32]: val = val >>22
In [33]: print "hex x %d 0x%08X" % (val, val & 0xffffffff)
hex x -1 0xFFFFFFFF
In [34]: val = 4294967295
In [35]: print "hex x %d 0x%08X" % (val, val & 0xffffffff)
hex x 4294967295 0xFFFFFFFF
In [36]: val = val >>22
In [37]: print "hex x %d 0x%08X" % (val, val & 0xffffffff)
hex x 1023 0x000003FF
我真的很感激任何澄清,谢谢。
答案 0 :(得分:2)
4294967295是0x0 ... 0FFFFFFFF。 -1是0xF ... FFFFFFFF。的永远。强>
答案 1 :(得分:2)
简短版本:因为操作是以这种方式定义的。
长版本:根据文档,“整数表示的规则旨在给出涉及负整数的移位和掩码操作的最有意义的解释。”在数字可以任意大小但具有2s补码表示的系统中,遵循 - 至少在概念上 - 符号扩展也随意地进行。所以这真的是唯一有意义的解释。
这保留了x >> n
< =>的不变量。 int(x / (2 ** n))
还有负数。{/ p>
答案 2 :(得分:1)
当在表达式中使用负数时,通过二进制补码算法的规则,符号位必须一直扩展到表达式的左位。右移保留最左边的1位。向右移动足够位数的负数将始终等于-1,正如向右移动足够位数的正数始终等于0.