gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:12:48 25 4
gpt4 key购买 nike

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

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

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

我理解/怀疑这是由于表示形式的差异(未签名与已签名)造成的,并且已尝试按照这些思路阅读但无济于事。使 Java 代码获得与 C++ 代码相同结果的最佳方法是什么?

最佳答案

C++ 代码似乎在 32 位整数上运行。使用 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++ 中的溢出,请使用 long在 Java 中,但通过使用 0xFFFFFFFFL 进行位与运算来对最后 32 位进行位屏蔽.

关于java - Java 和 C++ 中的位移位差异 - 如何调和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25536335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com