# Python之位移操作符所带来的困惑

+关注继续查看

Python 中执行左移操作（即将一个数的二进制位整体向左移若干位，移位后在低位补零，高位溢出部分舍弃）：

>>> 1000<<25

Console.WriteLine(1000<<25);

>>> 1000L<<25 (注：L后缀代表Long数据类型)
33554432000L

>>> -1<<100
-1267650600228229401496703205376L

>>> 1<<100
1267650600228229401496703205376L

C#中执行同样代码，结果有着巨大的差异：

Console.WriteLine(1000L << 25);

33554432000 LONG类型的左移结果是一致的）

Console.WriteLine(-1 << 100);

-16

Console.WriteLine(1 << 100);

16

Javascript的结果也是对的，把下面的代码保存为html文件：

<html>
<script type="text/javascript">
</script>
<body>
</body>
</html>

（只不过Python3执行 1000<<25 的结果是 33554432000 ，没有加L后缀），

A right shift by n bits is defined as division by pow(2,n)A left shift by n bits is defined as multiplication with pow(2,n);

for plain integers there is no overflow check so in that case the operation drops bits and flips the sign if the result is not less than pow(2,31) in absolute value. Negative shift counts raise aValueError exception.

（译文：右移n位可以定义为除以pow(2,n)，左移n位可以定义为乘以pow(2,n)；对于普通整数是没有溢出检查的,因此若结果的绝对值不小于pow(2,31) 这个运算会截掉相应的位并且符号位也在移位处理之列

Python x<<y 相当于直接调用：

int(x * 2**y) 函数

Shifting negative numbers doesn't have consistent interpretation between python and C.（译文：负数的位移操作，pythonC语言的解释是不一致的。）

Python 创始人 Guido van Rossum ，在今年2月份的博文

Early Language Design and Development From ABC to Python

“In addition, the int type, while normally considered signed, was treated as

an unsigned number by bitwise and shift operations and by conversions to/from octal and hexadecimal representations. Longs, on the other hand, were always considered signed. Therefore, some operations would produce a different result depending on whether an argument was represented as an int or a long.”

（译文：int类型通常情况下是有符号数，在位操作、位移操作、和8进制/16进制互相转换时则当做无符号数。而相对应的，long类型则总是有符号数因此，某些操作会因为参数是由int还是long类型表达而产生不同的结果。）

I should have made integer operations that overflow promote their result to longs. This is the way that Python works today, but it took a long time to make this transition.

（译文：我应该让溢出的int整数操作结果升级为long类型。这也是今天Python采用的方式，可惜这个修正太晚了。）

while True: x = 1 << 64 会导致内存泄漏；而 while True: 1L << 64 则不会。

Python的整型数据的位宽是32位，8个字节。int 最大值是2147483647 (sys.maxint)，而long 长度仅受内存大小限制。

C/C++ 中，int 的长度  机器字长 相同，16位的编译器上int16位，32位的编译器上int32位。

Python（一）转义字符及操作符
Python（一）转义字符及操作符
43 0
Python 基础知识标识符和操作符 |学习笔记

201 0
Python 为什么不支持 i++ 自增语法，不提供 ++ 操作符？

119 0
python字符串格式化 (%操作符)

83 0
Python入门（二）快捷键、操作符和BIF

11899 0
+关注

☑移动数据业务&times;6年 ☑语义聚合&times;4年 ☑O2O&times;5年的一个老兵。