2016-06-21 58 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