英文:
Bitwise operation && overflow
问题
以下是翻译好的内容:
为什么这两行 Java 代码的结果不同?
int a = 1;
System.out.println(a << 32); //输出:1
System.out.println(a << 31 << 1); //输出:0
英文:
Why the results of this two lines are different in java?
int a = 1;
System.out.println(a << 32); //output: 1
System.out.println(a << 31 << 1); //output: 0
答案1
得分: 2
> 如果左操作数的提升类型是int,则只使用右操作数的五个最低位
因此,当移位一个int时,移位距离实际上是右操作数的值对32取模(至少当右操作数为非负数时)。因此,a << 32基本上与a << 0相同,即只是a。但是,a << 31 << 1首先将值为0x00000001的a左移31位得到0x80000000,然后再将其左移1位得到0x00000000。
英文:
Per JLS 8 § 15.19
> If the promoted type of the left-hand operand is int, then only the
> five lowest-order bits of the right-hand operand are used
When shifting an int the shift distance is thus effectively the value of the right operand mod 32 (at least when the right operand is non-negative). So a << 32 is basically the same as a << 0, i.e., just a. But a << 31 << 1 first shifts a, whose value is 0x00000001, left by 31 to yield 0x80000000, which is then shifted left by 1 to yield 0x00000000.
专注分享java语言的经验与见解,让所有开发者获益!

评论