Java和JavaScript中的运算符>>>有啥区别?
Posted
技术标签:
【中文标题】Java和JavaScript中的运算符>>>有啥区别?【英文标题】:What is the difference between operator >>> in Java and JavaScript?Java和JavaScript中的运算符>>>有什么区别? 【发布时间】:2017-04-21 01:23:21 【问题描述】:javascript 代码:
alert( -123456 >>> 0 ); // Prints 4294843840
Java 代码:
System.out.println( -123456 >>> 0 ); // Prints -123456
为什么?我已阅读文档,但没有发现差异。如何将 JavaScript 代码移植到 Java?
【问题讨论】:
如果你想在 JS 中签名右移,使用>>
。
Java部分,另见***.com/questions/2811319/difference-between-and
【参考方案1】:
两者都是逻辑右移,但 JavaScript 在处理数字方面有些奇怪。 JavaScript 中的数字通常是浮点数,但按位运算将它们转换为无符号 32 位整数。因此,即使值看起来不应该改变,它也会将数字转换为 32 位无符号整数。
您看到的值4294843840
与-123456
的位相同,但被解释为无符号而不是有符号。
【讨论】:
次要 nit;它们不是“float-like”,它们一直是明确 IEEE-754。这里的问题来自内部的临时转换。 所以基本上在java和javascript中,在这个例子中,没有发生'右移'(因为移位是'0'),而是在javascript中,它只是转换数为无符号数。这种理解正确吗? 是的,没错。 (它也将其转换为 int,但在这种情况下不会改变任何东西) 值得注意的是,这可能不是特定于语言的事情,而是特定编译器和特定解释器之间的差异。 Java 也显然将有符号转换为无符号,但在 OP 的示例中,它已被优化 - 所以什么也没有发生。在@kishan-c-s 提供的答案中,很明显 Java 也转换为 unsigned int,但 JS 只是没有优化操作。 Java 没有无符号整数。 @kishan-c-s 示例不是基于运算符的转换,而是运算本身的结果导致值变为正数。以上是关于Java和JavaScript中的运算符>>>有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章