2016-12-06 8 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とちょうど同じビットですが、符号の代わりに符号なしと解釈されます。

+13

も参照してください。彼らはフロートのようなものではなく、明示的* IEEE-754です。ここでの問題は、内部の一時的な変換によるものです。 –

+2

これは基本的にjavaとjavascriptの両方にあります。この例では、「右シフト」は起こっていません(シフトは '0'なので)。むしろjavascriptでは、番号を符号なしの数値に変換するだけです。この理解は正しいのですか? –

+0

はい、正しいです。 (これもintに変換しますが、この場合は何も変わりません) – Iluvatar