【问题标题】:Why the following bitwise operation will generate a Numeric Overflow?为什么下面的按位运算会产生数值溢出?
【发布时间】:2018-08-02 10:41:38
【问题描述】:

我有以下相当直接的逐位操作

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

【问题讨论】:

  • 使用 intellij 2018.2 - 我没有警告...

标签: java android intellij-idea


【解决方案1】:

这似乎是 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)

【讨论】:

    【解决方案2】:

    您移入符号位:131 和 Integer.MAX_VALUE = 231 - 1。 因此存在(符号)溢出,您实际上得到了 Integer.MIN_VALUE。进一步减1也可以称为溢出(进位),并且可能触发错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多