2016-06-21 37 views
2

我想在Ruby中复制JavaScript校验数字函数。结果是不同的,它看起来好像与整数的大小有关。JavaScript和红宝石整数之间的区别(使用左移位运算符)

在红宝石:

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

1421974191 | 45503174112产生

在javascript:

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

1421974191 | -1741466144产生

我会很感激为什么会出现这种情况,以及我如何在Ruby中复制JavaScript。

在此先感谢

回答

3

JS”位运算符仅限于32位值,所以你得到的溢出。 From the MDN page

所有按位运算符的操作数都以二进制补码格式转换为带符号的32位整数。

现代JS引擎会更喜欢的二进制补码格式,并摆脱困境的64位浮点值,如果你把他们,但位运算符做任何事情之前强制转换回32位整数。

该规范非常明确。从section 12.8.3.1

  • 返回由shiftCount转换比特左移lnum缓冲区里的结果。结果是一个有符号的32位整数。
  • 为了模拟在Ruby中的整数溢出(或具有大量任何语言),您可以用公式(从this Python answer拍摄):

    ((n + 2147483647) % 4294967294) - 2147483647 
    

    的答案指出,这仅适用于左移,不分区或右移。

    +0

    感谢@ssube,它看起来像一个JS的限制,任何想法在Ruby中复制此? –

    +0

    @d_a_n我从来没有听说过任何人想要强制溢出,但这是相当简单的数学。编辑它。 – ssube