为什么以下按位运算会产生数字溢出?

时间:2018-08-02 10:41:38

标签: java android intellij-idea

我有以下相当简单的按位操作

final int mask = ((1 << 31) - 1);

但是,我真的不知道为什么,Android Studio(IntelliJ)IDE会给我Numeric Overflow警告

enter image description here


我在台式机上进行了快速运行

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会给我这样的警告?

2 个答案:

答案 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也可以称为溢出(进位),并且可能触发了错误。