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 位时它们不会回绕到负数。
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 位时它们不会回绕到负数。