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中的运算符>>>有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的-->运算符是啥? [复制]

javascript中的'||'和‘&&'的高级用法

C ++中的“&”和“>>”数字运算符?

是否有与 Java 正则表达式中的交集 (&&) 运算符等效的 JavaScript 正则表达式?

JavaScript中的运算符优先级

instanceof运算符的实质:Java继承链与JavaScript原型链