<p>w3schools.com的定义更能描述Python2,它有32位整数:1位表示符号(最左边),31位表示大小,以两位补码表示</p>
<p>因此,当它说“推送最左边位的副本”时,意味着符号位向右传播,因此右移负数会返回一个仍然为负数的值</p>
<p>例如,在Python2中,如果取最大的负整数(如中所示,距离零最远),则表示<code>int</code>:</p>
<pre><code>>>> i = -sys.maxint - 1
>>> i
-2147483648
</code></pre>
<p>然后向右移动,仍然会得到一个负数:</p>
<pre><code>>>> i >> 16
-32768
</code></pre>
<p>如果将所有位(包括符号位)右移并替换为零,则不会得到该值:取而代之的是32768(0x00008000)</p>
<p>如果改为将<code>i</code>向左移位一位,则会导致32位整数下溢(因为零将被移位到符号位,使其为正,并且幅值将全部为零)。Python 2通过将<code>i</code>强制为Python 2<code>long</code>来保护您不受此影响:</p>
<pre><code>>>> i << 1
-4294967296L
</code></pre>
<p>Python 2<code>long</code>与Python 3整数非常相似</p>
<p>由于Python3非常小心地保持移位运算符的行为与Python2相同,因此如果将Python3整数向右移位16位,将得到相同的结果</p>
<p>但机制是不同的。移位运算符处理整数的<em>概念</em>位表示。文档中的短语是这样的:注意短语<em>,好像</em>:</p>
<blockquote>
<p>The result of bitwise operations is calculated as though carried out in two’s complement with an infinite number of sign bits.</p>
</blockquote>
<p>Python整数在内部并不是由可变长度的两位补码二进制数表示的:其大小是一个30位数字的序列,符号单独存储,但最好不要担心太多。移位运算符根据<em>概念</em>表示给出结果,而不是实际的物理表示</p>
<p>另一方面,每当您对这样的主题有疑问时,最好直接阅读Python文档,它总是准确的,几乎总是示例性的。Python的受欢迎程度吸引了博客作者,他们中的一些人对自己的主题缺乏安全感,而第三方教程材料往往带有对最初为Python 2编写的内容进行不充分修订的痕迹</p>