JavaScript 和 Python 按位或运算给出了不同的结果

JavaScript and Python bitwise OR operation gave different results

JS

console.log(1 | 1); // 1
console.log(1 | 0x8); // 9
console.log(1 | 0x80000000); // -2147483647

python

print (1 | 1) # 1
print (1 | 0x8) # 9
print (1 | 0x80000000) # 2147483649

为什么最后几个例子的结果不同?

JavaScript 行为在 MDN

中有所描述

The operands of all bitwise operators are converted to signed 32-bit integers in two's complement format, except for zero-fill right shift which results in an unsigned 32-bit integer.

所以你在 JavaScript 中得到负数,因为它将值视为 32 位有符号数。 0x80000000 位是符号位。

上述引用末尾的限定符指明了获得与 Python:

相同结果的方法

console.log((1 | 0x80000000) >>> 0);

>>> 是零填充右移运算符。移动 0 位不会改变值,但它会转换为无符号。

Python 整数具有无限精度,因此当它们到达 32 位时它们不会回绕到负数。