一尘不染

用Java长移位

java

我确定这对任何人来说都是一件容易的事!

为什么在Java中代码像

   long one = 1 << 0;
   long thirty = 1 << 30;
   long thirtyOne = 1 << 31;
   long thirtyTwo = 1 << 32;

   System.out.println(one+" = "+Long.toBinaryString(1 << 0));
   System.out.println(thirty+" = "+Long.toBinaryString(1 << 30));
   System.out.println(thirtyOne+" = "+Long.toBinaryString(1 << 31));
   System.out.println(thirtyTwo+" = "+Long.toBinaryString(1 << 32));

打印

1 = 1
1073741824 = 1000000000000000000000000000000
-2147483648 = 1111111111111111111111111111111110000000000000000000000000000000
1 = 1

这对我来说没有意义。long是一个64位数字-而它看起来像int上面的一个。我知道bitshifted
bytes会进行int提升,但是在这种情况下我看不到发生了什么。

任何关于这里发生的事情的指针都将是很好的:)

谢谢

编辑 :感谢所有的答案-单击“提交”后,我意识到发生了什么,但是进入了readonly模式,我无法删除!非常感谢!


阅读 226

收藏
2020-12-03

共1个答案

一尘不染

这是因为1是int文字,因此<<将其应用于整数。结果强制转换为long,但那时为时已晚。

如果您写1L << 32, 等等 ,那么一切都会好起来的。L用于表示long文字。

2020-12-03