我正在尝试在Ruby中复制javascript check digit函数。结果不同,看起来好像它与整数的大小有关。
Ruby中的:
puts "#{1421974191} | #{(1421974191 << 5)}"
生成1421974191 | 45503174112
在javascript中:
alert(1421974191 + ' | ' + (1421974191 << 5))
生成1421974191 | -1741466144
我很感激有关为什么会这样做的任何建议,以及如何在Ruby中复制javascript。
提前致谢
丹
答案 0 :(得分:3)
JS&#39;按位运算符限制为32位值,因此您将获得溢出。来自the MDN page:
所有位运算符的操作数都以2的补码格式转换为带符号的32位整数。
现代JS引擎实际上更喜欢二进制补码格式,并且如果你推送它们就会挽救一个64位浮点值,但是在执行任何操作之前,按位运算符会强制转换回32位整数。
规范非常明确。来自section 12.8.3.1:
- 通过shiftCount位返回左移lnum的结果。结果是带符号的32位整数。
醇>
要模仿Ruby(或任何大数字语言)中的整数溢出,您可以使用公式(取自this Python answer):
((n + 2147483647) % 4294967294) - 2147483647
正如答案所指出的,这只适用于左移,而不是分割或右移。