我的情况我不明白。 当我做的时候
System.out.println(1<<30);
我得到了非常大的正数1073741824。 但是当我做的时候
System.out.println(1<<31);
我的号码非常低-2147483648。 因为我读长类型是64位长。最大数量为2 ^ 63 -1。所以在这里,我不明白为什么我的转变为负(((( 做
System.out.println((long)(1<<31));
也给出相同的结果((
答案 0 :(得分:6)
1 << 31
是一个int,不是很长的。你所拥有的并不是溢出,而是Integer.MIN_VALUE
(符号位设置,所有其余的零)。
除非您对它们进行适当的后缀,否则Java中的任何数字常量默认为int
。如果你想要很长的话,你必须告诉编译器你需要很长的时间:1L << 31
(注意L
)。
请注意,即使(long) (1 << 31)
也无法运作;即使在这种情况下,1 << 31
仍然是一个int。铸造&#34;事后&#34;没有帮助;)
答案 1 :(得分:0)
当我们向左移动1到31时,我们得到0x80000000,这是Integer.MIN_VALUE = -2147483648。参见Integer类。