当前位置:  开发笔记 > 编程语言 > 正文

Java Integer左移的奇怪结果

如何解决《JavaInteger左移的奇怪结果》经验,为你挑选了1个好方法。

我现在对java左移操作有点困惑,

1<<31 =  0x80000000  --> this I can understand

1<<32 =  1       Why is this?
1<<33 =  2       

看起来更多的移动值,采用模数32的值.

感谢大家的回复和JLS的报价.

我只想知道更多.知道它以这种方式设计的原因吗?或者只是一些惯例?显然C没有这个怪癖?

感谢@paxdiablo.看起来像C声明这个行为未定义.

我在这里有一些个人假设:

ARM体系结构参考手册A7.1.38

语法LSL Rd,Rm,#immed_5

哪里:

Rd 是存储操作结果的寄存器.

Rm是包含要移位的值的寄存器.

immed_5指定移位量,范围为0到31.

在指令级别,immedidate immed_5只需要5位就可以避免无意义的操作,从而节省一些指令空间.我想高级语言只是将这个约定统一起来,以避免在编译指令时产生无意义的努力.



1> paxdiablo..:

根据Java语言规范15.19. Shift Operators(稍微解释):

如果左手操作数的提升类型是int,则只使用右手操作数的五个最低位作为移位距离.就好像右手操作数受到&带掩码值的按位逻辑AND运算符0x1f,或者0b11111.实际使用的移位距离因此总是在范围031,包括端值.

这意味着(例如)33,作为6位二进制100001,00001在使用之前减少到5位.所以x << 33是完全相同的x << 1.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有