我遇到了Java返回错误值的左位移问题...
取108<<例如60。答案应该是*:
124515522497539473408
Java正在返回此值
-4611686018427387904
这句话:
System.out.println(108L << 60L);
为什么???这两个值都是强制long ...所以我认为没有理由为什么应该截断任何位值。我在这里缺少什么?
*引文:Wolfram Alpha
答案 0 :(得分:4)
您正在超出long
(64位)的长度。 108占用7位,因此108L << 60L
需要67位来正确表示它。实际上,由于它是一个有符号的类型,你需要68位来避免它被解释为负数。
答案 1 :(得分:1)
108是7位,因此&lt;&lt; 60是67位数。
答案 2 :(得分:1)
代表108L << 60
的数字太大而无法表示为long
。所以你正在溢出,并且丢失了高位。
如果你想表示这么大的数字(没有截断),最简单的就是使用BigInteger
。
顺便提一下,移位运算符的第二个操作数不需要是long
。通过将操作数截断为0到63范围内的数字(long
移位)来计算实际移位计数 - 请参阅JLS 15.19。