代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

为什么下面的按位操作将生成数字溢出?

  •  0
  • Cheok Yan Cheng  · 技术社区  · 7 年前

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

    final int mask=(1<<31)-1);
    < /代码> 
    
    

    但是,我真的不明白为什么,Android Studio(Intellij)IDE会给我数字溢出警告


    我在桌面上快速运行了一次

    public static void main(string[]args){
    最终int mask=(1<<31)-1);
    system.out.println(mask);/2147483647
    system.out.println(integer.max_value);/2147483647
    }
    < /代码> 
    
    

    我觉得很好。然而,我很困惑,为什么伊迪给我这样的警告?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
    }
    

    我觉得很好。然而,我很困惑,为什么伊迪给我这样的警告?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Soner from The Ottoman Empire    7 年前

    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
  •  2
  •   Joop Eggen    7 年前