在java中进行位移时溢出

时间:2014-12-10 14:35:09

标签: java long-integer integer-overflow

我的情况我不明白。 当我做的时候

 System.out.println(1<<30);

我得到了非常大的正数1073741824。 但是当我做的时候

 System.out.println(1<<31);

我的号码非常低-2147483648。 因为我读长类型是64位长。最大数量为2 ^ 63 -1。所以在这里,我不明白为什么我的转变为负(((( 做

System.out.println((long)(1<<31));

也给出相同的结果((

2 个答案:

答案 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类。