加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java和C中的位移差异 – 如何协调

发布时间:2020-12-15 04:22:05 所属栏目:Java 来源:网络整理
导读:我在C中有一些代码,我正在尝试移植到 Java,并且存在一个我无法解决的问题. 通过一个例子可以很容易地看到它.在C代码的某个阶段,我有一个unsigned int h,其值为594076817.然后我计算(h 10).我得到的结果是2744271872. 在Java中,我有一个很长的594076817.然后
我在C中有一些代码,我正在尝试移植到 Java,并且存在一个我无法解决的问题.

通过一个例子可以很容易地看到它.在C代码的某个阶段,我有一个unsigned int h,其值为594076817.然后我计算(h << 10).我得到的结果是2744271872. 在Java中,我有一个很长的594076817.然后我计算(h <<< 10),我得到608334660608. 我理解/怀疑这是由于表示的差异(unsigned vs signed)并试图沿着这些方式阅读而无济于事.使Java代码获得与C代码相同的结果的最佳方法是什么?

解决方法

C代码似乎以32位整数运行.使用Java的32位整数类型int,代码

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

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

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

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

为了获得期望的结果,这似乎依赖于C中的溢出,在Java中使用long,但是使用0xFFFFFFFFL通过位和位对最后32位进行位掩码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读