2016-12-06 90 views
29

JavaScript代碼:運算符>>>在Java和JavaScript中有什麼區別?

alert(-123456 >>> 0); // Prints 4294843840 

Java代碼:

System.out.println(-123456 >>> 0); // Prints -123456 

爲什麼?我已閱讀文檔,但我沒有找到差異。如何將JavaScript代碼移植到Java?

+0

如果你想在JS中進行一個有符號的右移,使用'>>'。 – Bergi

+0

對於Java部分,請參閱http://stackoverflow.com/questions/2811319/difference-between-and – Tunaki

回答

34

這兩者都是邏輯上的右移,但JavaScript在處理數字方面有一些奇怪之處。通常JavaScript中的數字是浮點數,但按位運算將它們轉換爲無符號的32位整數。所以,即使該值看起來不應該改變,它也會將該數字轉換爲32位無符號整數。

您看到的值4294843840-123456只是相同的位,但解釋爲無符號而不是signed。

+13

Minor nit;它們不是「像浮子一樣」,它們總是*顯式地* IEEE-754。這裏的問題來自內部的臨時轉換。 –

+2

所以基本上在java和javascript中,在這個例子中,沒有發生'右移'(因爲shift是'0'),而是在javascript中,它只是將數字轉換爲無符號數。這種理解是否正確? –

+0

是的,這是正確的。 (它也將它轉換爲int,但在這種情況下不會改變任何東西) – Iluvatar

相關問題