[英]Python Bit Shifting Negative vs positive values
我最近正在進行移位,想知道為什么在下面的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
非常感謝您的澄清,謝謝。
4294967295是0x0 ... 0FFFFFFFF。 -1是0xF ... FFFFFFFF。 永遠。
簡短版本:因為操作是用這種方式定義的。
加長版:根據文檔,“整數表示規則旨在最有意義地解釋涉及負整數的移位和掩碼運算。” 在一個數字可以任意大小但補碼表示為2的系統中,至少在概念上,符號擴展也可以任意攜帶。 因此,這實際上是唯一有意義的解釋。
這樣也保留了x >> n
<=> int(x / (2 ** n))
的不變量。
當在表達式中使用負數時,根據二進制補碼的規則,符號位必須一直擴展到表達式的左位。 右移保留了最左邊的1位。 向右偏移足夠數量的位數的負數將始終等於-1,就像向右偏移足夠數量的位數的正數將始終等於0一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.