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)
也给出了相同的结果(((
1 << 31
是一个int,而不是一个长.你所拥有的并不是溢出,而是Integer.MIN_VALUE
(符号位设置,所有其余的零).
除非您对它们进行适当的后缀,否则Java中的任何数字常量都是int
默认值.如果你想有一个长久,你要告诉你想要一个长期的编译器:1L << 31
(注意L
).
请注意,即使(long) (1 << 31)
不起作用; 即使在这种情况下,1 << 31
仍然是一个int.铸造"事后"并没有帮助;)