我遇到了我不明白的情况。 当我这样做时
System.out.println(1<<30);
我得到了非常大的正数 1073741824。 但当我这么做的时候
System.out.println(1<<31);
我得到的数字非常低-2147483648。 据我了解,long 类型是有符号的 64 位长。最大数量为 2^63 -1。所以在这里我不明白为什么我的转变为负(((( 正在做
System.out.println((long)(1<<31));
也给出了相同的结果(((
最佳答案
1 << 31
是一个 int,而不是一个 long。你所拥有的并不是真正的溢出,而是 Integer.MIN_VALUE
(符号位设置,其余全部为零)。
除非您适本地添加后缀,否则 Java 中的任何数字常量都是 int
默认情况下。如果你想要一个 long,你必须告诉编译器你想要一个 long: 1L << 31
(注意 L
)。
请注意,甚至 (long) (1 << 31)
行不通;即使在这种情况下,1 << 31
仍然是一个整数。 “事后”选角没有帮助;)
关于java - java中位移位时溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27403638/