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

时间:2016-06-21 20:22:28

标签: javascript ruby

我正在尝试在Ruby中复制javascript check digit函数。结果不同,看起来好像它与整数的大小有关。

Ruby中的

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

生成1421974191 | 45503174112

在javascript中:

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

生成1421974191 | -1741466144

我很感激有关为什么会这样做的任何建议,以及如何在Ruby中复制javascript。

提前致谢

1 个答案:

答案 0 :(得分:3)

JS&#39;按位运算符限制为32位值,因此您将获得溢出。来自the MDN page

  

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

现代JS引擎实际上更喜欢二进制补码格式,并且如果你推送它们就会挽救一个64位浮点值,但是在执行任何操作之前,按位运算符会强制转换回32位整数。

规范非常明确。来自section 12.8.3.1

  
      
  1. 通过shiftCount位返回左移lnum的结果。结果是带符号的32位整数。
  2.   

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

((n + 2147483647) % 4294967294) - 2147483647

正如答案所指出的,这只适用于左移,而不是分割或右移。