我有以下相当直接的逐位操作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 会给我这样的警告?
2 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
这似乎是 IntelliJ 2018.1 中的一个问题。这里是解释,
IDEA-182699 数字溢出:如果左移结果使数字为负,则添加一个忽略选项 -它的问题
编译器获取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)
猛跑小猪
TA贡献1858条经验 获得超8个赞
你转移到符号位:1<<31 = 2 31和 Integer.MAX_VALUE = 2 31 - 1。因此有(符号)溢出,你实际上得到了 Integer.MIN_VALUE。进一步减 1 也可以称为溢出(进位),并且可能触发错误。
添加回答
举报
0/150
提交
取消