gpt4 book ai didi

javascript - javascript 和 ruby​​ 整数之间的区别(使用左移按位运算符)

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:57 25 4
gpt4 key购买 nike

我正在尝试在 Ruby 中复制一个 javascript 校验位函数。结果不同,看起来好像与整数的大小有关。

在 ruby 中:

puts "#{1421974191} | #{(1421974191 << 5)}"

产生1421974191 | 45503174112

在 JavaScript 中:

alert(1421974191 + ' | ' + (1421974191 << 5))

产生1421974191 | -1741466144

如果您能就为什么会发生这种情况以及如何在 Ruby 中复制 javascript 提供任何建议,我将不胜感激。

提前致谢

最佳答案

JS 的按位运算符仅限于 32 位值,因此会发生溢出。来自 the MDN page :

The operands of all bitwise operators are converted to signed 32-bit integers in two's complement format.

现代 JS 引擎实际上更喜欢二进制的补码格式,如果您推送它们,则会跳出 64 位浮点值,但按位运算符会在执行任何操作之前强制转换回 32 位整数。

规范对此非常明确。来自 section 12.8.3.1 :

  1. Return the result of left shifting lnum by shiftCount bits. The result is a signed 32-bit integer.

要模拟 Ruby(或任何具有大数字的语言)中的整数溢出,您可以使用公式(取自 this Python answer):

((n + 2147483647) % 4294967294) - 2147483647

如答案所述,这仅适用于左移,不适用于除法或右移。

关于javascript - javascript 和 ruby​​ 整数之间的区别(使用左移按位运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37953900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com