2016-12-06 54 views
29

kod JavaScript:Jaka jest różnica między operatorem >>> w Javie i JavaScript?

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

kod Java:

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

Dlaczego? Czytałem dokumentację, ale nie znalazłem różnicy. Jak przesłać kod JavaScript do Java?

+0

Jeśli chcesz podpisaną prawą zmianę w JS, użyj '>>'. – Bergi

+0

Dla części dotyczącej języka Java zobacz także http://stackoverflow.com/questions/2811319/difference-between-and – Tunaki

Odpowiedz

34

Obie są logiczną prawą zmianą, ale JavaScript ma dziwny wpływ na sposób obsługi liczb. Zwykle liczby w JavaScript są zmiennoprzecinkowe, ale operacje bitowe konwertują je na 32-bitowe liczby całkowite bez znaku. Więc mimo że wartość wygląda tak, że nie powinna się zmieniać, konwertuje liczbę na 32-bitową liczbę całkowitą bez znaku.

Wartość, którą widzisz 4294843840, jest dokładnie taka sama, jak -123456, ale interpretowana jako niepodpisana zamiast podpisu.

+13

Drobne nitowanie; nie są "float-like", są * wyraźnie * IEEE-754, przez cały czas. Kwestia tutaj pochodzi z wewnętrznej, tymczasowej konwersji. –

+2

, więc w zasadzie zarówno w java, jak i javascript, w tym przykładzie nie ma "prawostronnej zmiany" (ponieważ przesunięcie to "0"), ale raczej w javascriptu, konwertuje tylko liczbę na niepodpisany numer. czy to zrozumienie jest poprawne? –

+0

Tak, to prawda. (Konwertuje to również na int, ale to niczego nie zmienia w tym przypadku). – Iluvatar