Java Integer左移的奇怪结果



我现在对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 范围内的班次量。

在指令层面,immeidate immed_5只需要5位,以避免无意义的操作,从而节省一些指令空间。我想高级语言只是将这个约定统一起来,以避免在编译为指令时进行无意义的努力。

根据 Java 语言规范15.19. Shift Operators(略带释义(:

如果左操作数的提升类型是int则只有右操作数的五个最低阶位用作移位距离。 就好像右侧操作数受到掩码值 0x1f0b11111 的按位逻辑 AND 运算符&的影响。因此,实际使用的移位距离总是在031的范围内。

这意味着(例如(33,作为6位二进制100001,在使用之前被简化为5位00001。所以x << 33x << 1相同.

System.out.println(Integer.toBinaryString(1 << 32)); 

将二进制 1(10( 向左移动 32 倍。因此:十进制中的 1

System.out.println(Integer.toBinaryString(1 << 33)); 

现在,int 是 4 个字节,因此是 32 位。因此,当您按 33 移位时,它相当于移位 1。因此:2 在十进制

最新更新