Java和C++中的位偏移差异-如何协调

Bit shifting difference in Java and C++ - how to reconcile

本文关键字:何协调 协调 C++ Java      更新时间:2023-10-16

我在C++中有一些代码试图移植到Java,但有一个问题我无法解决。

举个例子很容易看出。在C++代码的某个阶段,我有一个值为594076817的无符号int h。然后我计算(h<<10)。我得到的结果是2744271872。

在Java,我有一个长594076817。然后我计算(h<<10),得到608334660608。

我理解/怀疑这是由于表示方式的差异(无符号与有符号),并试图按照这些思路阅读,但没有效果。让Java代码获得与C++代码相同的结果的最佳方法是什么?

C++代码似乎在32位int上运行。使用Java的32位整数类型int,代码

int h = 594076817;
System.out.println(h << 10);

打印-1550695424(Java的int被签名)。这是2744271872-232。当数据类型更改为64位整数类型long时,答案会更改:

long h = 594076817L;
System.out.println(h << 10);

这将打印608334660608。当您截断608334660608的低32位之外的所有内容时,您将得到int的答案:2744271872

为了获得所需的结果,似乎依赖于C++中的溢出,在Java中使用long,但使用0xFFFFFFFFL逐位屏蔽最后32位。