在Java中,为什么1L << 67等于8?

pup*_*lpg -1 java

正如标题中所要求的那样.

我知道1L << 3 = 8,长类型是64位.67 - 64 = 3.但为什么1L << 67还有同样的效果1L << 3呢?为什么不发生"比特溢出"之类的事情?

是否有任何文档定义此行为?谢谢.

Iły*_*sov 5

来自https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19

如果左边的操作数的提升的类型是长,则仅右边的操作数的六个最低阶位被用作移位距离.就好像右手操作数受到按位逻辑AND运算符&(§15.22.1)和掩码值0x3f(0b111111)的影响.因此,实际使用的移位距离始终在0到63的范围内,包括0和63.

所以, 67 & 0x3f = 3