为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森栏 2021-06-22 11:07:21
我有以下相当直接的逐位操作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 数字溢出:如果左移结果使数字为负,则添加一个忽略选项 -它的问题


编译器获取1int. 关于什么?

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)


查看完整回答
反对 回复 2021-06-23
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

你转移到符号位:1<<31 = 2 31和 Integer.MAX_VALUE = 2 31 - 1。因此有(符号)溢出,你实际上得到了 Integer.MIN_VALUE。进一步减 1 也可以称为溢出(进位),并且可能触发错误。


查看完整回答
反对 回复 2021-06-23
  • 2 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信