Java和JavaScript中的运算符>>>有什么区别?

30

JavaScript代码:

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

Java 代码:

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

为什么?我已经阅读了文档,但我没有找到区别。如何将JavaScript代码移植到Java?


如果你想在 JavaScript 中进行有符号的右移操作,请使用 >> - Bergi
Java部分请参见https://dev59.com/0nE85IYBdhLWcg3wXCS1 - Tunaki
1个回答

35

两者都是逻辑右移,但 JavaScript 在处理数字时存在一些奇怪的问题。通常情况下,JavaScript 中的数字是浮点数,但位运算会将它们转换为无符号 32 位整数。因此,即使该值看起来不应该改变,它也会将该数字转换为 32 位无符号整数。

你看到的值 4294843840 只是与 -123456 相同的比特,但解释为无符号而不是有符号。


13
细微的问题;它们并不是“类似于浮点数”的,它们始终是明确的IEEE-754。这里的问题来自于内部临时转换。 - Dave Newton
2
所以基本上在Java和JavaScript中,在这个例子中,没有发生“右移位”(因为移位是“0”),但在JavaScript中,它只是将数字转换为无符号数字。我的理解正确吗? - Zeeshan Arif
是的,没错。(它也将其转换为int,但在这种情况下不会改变任何内容) - Iluvatar
值得注意的是,这可能不是特定于语言的问题,而是特定编译器和解释器之间的差异。Java显然也将有符号转换为无符号,但在OP的示例中,它被优化掉了 - 因此什么也没有发生。对于kishan-c-s提供的答案,很明显Java也会转换为无符号整数,但JS只是不会优化掉该操作。 - Puzomor Croatia
8
Java没有无符号整数类型。@kishan-c-s的例子并不是基于运算符的转换,而是由于操作本身导致值变为正值。 - Iluvatar
糟糕,不知怎么搞的,我错过了那个。 - Puzomor Croatia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接