我相信这是一个容易的人看到它第一!
为什么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
在上面。我知道有点不对劲 byte
我们升职了,但我看不出这件事是怎么回事。
任何关于这里发生的事情的建议都是好的:)
谢谢
编辑:感谢所有的答案-我意识到发生了什么事,只要我点击'提交',但因此进入 readonly
模式,我不能删除!非常感谢!
7条答案
按热度按时间bbmckpt71#
因为1是一个
int
字面意思,所以<<
应用于整数。结果被抛到一边long
,但到那时已经太迟了。如果你写1l<<32等,那么一切都会好的。
L
用来表示long
字面意义的。yhxst69z2#
这是因为
1
排队long thirtyTwo = 1 << 32;
是一个int
默认情况下。在执行移位操作之前,需要将其显式标记为long。现在发生的是你在一个int
轮班结束后,从一个int
到long
.6mzjoqzu3#
首先:
java语言规范第15.19段
轮班操作员
如果左侧操作数的提升类型为int,则只有右侧操作数的五个最低阶位用作移位距离。这就好像右操作数接受了位逻辑“与”运算符&(§15.22.1),掩码值为0x1f(0b11111)。因此,实际使用的移动距离始终在0到31之间(包括0到31)。
如果左侧操作数的提升类型为long,则仅将右侧操作数的六个最低阶位用作移位距离。这就好像右操作数接受了位逻辑“与”运算符&(§15.22.1),掩码值为0x3f(0b111111)。因此,实际使用的移动距离始终在0到63之间(包括0到63)。
那么,为什么它的工作,如果你是转移
int
s而不是long
什么?因为你在转移int
s!尝试使用long
改为文字:doinxwow4#
你使用的是int文本,它的行为类似于int。使用长文字(即。
1L
)取而代之的是:当你有这样的表情
1 << 31
,它的计算结果是一个固定的值,而不管它被赋给什么int
或者long
.dgsult0t5#
literal 1是一个int。请使用1l(长度为l)并重试。
xjreopfe6#
问题是
1
是一个整数。它将在换班后很长一段时间内被转换成一个。尝试bfnvny8b7#
它就像一个
int
因为你在转移情报!要移动一个长的,你必须在所有的数字后面加上后缀l
.结果如下: