java - java中位移位时溢出

标签 java long-integer integer-overflow

我遇到了我不明白的情况。 当我这样做时

 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/

相关文章:

java - 从 HttpResponse 获取 ETAG 值

java - 在 spring jpa 查询中检索可选字段的结果

java - 如何检查Java中的两个数字相乘是否会导致溢出?

java - 还原哈希码 "sum"

android - 检查 Android NDK 代码中的整数溢出

java - 删除主键/id 引用的域实体时确保参照完整性

java - SimpleDateFormat 的线程安全问题

c# System.OverflowException 异常

c - C 中 long int 和 int 的大小显示 4 个字节