在java中进行位移时溢出

ovo*_*vod 0 java integer-overflow long-integer

我的情况我不明白.当我做

 System.out.println(1<<30);
Run Code Online (Sandbox Code Playgroud)

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

 System.out.println(1<<31);
Run Code Online (Sandbox Code Playgroud)

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

System.out.println((long)(1<<31));
Run Code Online (Sandbox Code Playgroud)

也给出了相同的结果(((

fge*_*fge 6

1 << 31是一个int,而不是一个长.你所拥有的并不是溢出,而是Integer.MIN_VALUE(符号位设置,所有其余的零).

除非您对它们进行适当的后缀,否则Java中的任何数字常量都是int默认值.如果你想有一个长久,你要告诉你想要一个长期的编译器:1L << 31(注意L).

请注意,即使(long) (1 << 31)不起作用; 即使在这种情况下,1 << 31仍然是一个int.铸造"事后"并没有帮助;)