【问题标题】: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?

【问题讨论】:

标签: javascript java operators


【解决方案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 示例不是基于运算符的转换,而是运算本身的结果导致值变为正数。
猜你喜欢
  • 2010-12-25
  • 2011-01-02
  • 2011-10-09
  • 1970-01-01
  • 2022-06-10
  • 2016-03-31
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多