Python与JS执行4235635936 << 0结果不同的原因及对齐方法
运算结果差异的原因
- Python的整数支持任意精度,位运算不会做溢出截断,
<< 0等价于直接返回原数,所以结果就是输入的4235635936。 - JS的位运算强制要求操作数先转换为32位有符号整数,超出32位的高位会直接丢弃。
4235635936的大小已经超过了32位有符号整数的最大值2147483647,二进制对应32位的值最高位为1,会被识别为负数的补码,最终转换为十进制就是-59331360。
Python实现和JS一致结果的方法
可以手动模拟JS的32位有符号整数截断逻辑,代码实现如下:
# 通用的模拟JS左移运算的方法 def js_left_shift(num: int, shift: int) -> int: res = (num << shift) & 0xFFFFFFFF return res if res < 0x80000000 else res - 0x100000000 # 调用测试 tmp = js_left_shift(4235635936, 0) print(tmp) # 输出:-59331360,和JS运算结果完全一致
如果只是单次运算,也可以直接用一行代码实现:
tmp = (4235635936 << 0) & 0xFFFFFFFF tmp = tmp if tmp < 0x80000000 else tmp - 0x100000000
内容的提问来源于stack exchange,提问作者Mezza QU
相关产品推荐
相关产品推荐

