我有以下相当简单的按位操作
final int mask = ((1 << 31) - 1);
但是,我真的不知道为什么,Android Studio(IntelliJ)IDE会给我Numeric Overflow
警告
我在台式机上进行了快速运行
public static void main(String[] args) {
final int mask = ((1 << 31) - 1);
System.out.println(mask); // 2147483647
System.out.println(Integer.MAX_VALUE); // 2147483647
}
对我来说似乎很好。但是,我很困惑,为什么IDE会给我这样的警告?
答案 0 :(得分:4)
似乎这是IntelliJ 2018.1中的一个问题。这是解释,
IDEA-182699数字溢出:添加一个忽略选项 按位移位结果使数字为负-Its question
编译器将1
作为int
。怎么了?
final int mask = (int)((1L << 31) - 1);
在数学上,
1000 0000 0000 0000 0000 0000 0000 0000 (1 << 31)
1111 1111 1111 1111 1111 1111 1111 1111 (-1)
-----------------------------------------
1 0111 1111 1111 1111 1111 1111 1111 1111 +
^
0111 1111 1111 1111 1111 1111 1111 1111 (truncate)
答案 1 :(得分:2)
您进入了符号位:1 << 31 = 2 31 和Integer.MAX_VALUE = 2 31 -1。 因此,有(符号)溢出,您实际上得到了Integer.MIN_VALUE。进一步减去1也可以称为溢出(进位),并且可能触发了错误。