为什么下面的按位运算会产生数值溢出?

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

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

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

http://img3.mukewang.com/60d30a85000198b906680380.jpg

我在桌面上快速运行


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


森栏
浏览 223回答 2
2回答

慕沐林林

这似乎是 IntelliJ 2018.1 中的一个问题。这里是解释,IDEA-182699&nbsp;数字溢出:如果左移结果使数字为负,则添加一个忽略选项 -它的问题编译器获取1为int.&nbsp;关于什么?final&nbsp;int&nbsp;mask&nbsp;=&nbsp;(int)((1L&nbsp;<<&nbsp;31)&nbsp;-&nbsp;1);在数学上,&nbsp; 1000 0000 0000 0000 0000 0000 0000 0000&nbsp; &nbsp; (1 << 31)&nbsp; 1111 1111 1111 1111 1111 1111 1111 1111&nbsp; &nbsp; (-1)-----------------------------------------1 0111 1111 1111 1111 1111 1111 1111 1111&nbsp; &nbsp; +^&nbsp; 0111 1111 1111 1111 1111 1111 1111 1111&nbsp; &nbsp; (truncate)

猛跑小猪

你转移到符号位:1<<31 = 2&nbsp;31和 Integer.MAX_VALUE = 2&nbsp;31&nbsp;- 1。因此有(符号)溢出,你实际上得到了 Integer.MIN_VALUE。进一步减 1 也可以称为溢出(进位),并且可能触发错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python