增加一个超过其最大值的整数会发生什么?

Lyk*_*yke 49 java math

在Java中,当你将int(或byte/short/long)增加到超出它的最大值时会发生什么?它是否包含最大负值?

是否AtomicInteger.getAndIncrement()也处于同样的方式?

Ted*_*opp 62

整数运算Java语言规范部分:

内置整数运算符不以任何方式指示溢出或下溢.

结果由语言指定,并且独立于JVM版本:Integer.MAX_VALUE + 1 == Integer.MIN_VALUEInteger.MIN_VALUE - 1 == Integer.MAX_VALUE.其他整数类型也是如此.

原子整数对象(AtomicInteger,AtomicLong等)在内部使用普通的整数运算符,因此getAndDecrement()等也表现出这种方式.


jte*_*ace 11

如果您这样做:

int x = 2147483647;
x++;
Run Code Online (Sandbox Code Playgroud)

如果您现在打印出来x,它将具有该值-2147483648.

  • `01111111111111111111111111111111` - >`10000000000000000000000000000000`.使用[two's complement](https://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement),第二个数字为负数. (2认同)

Gre*_*gJF 6

正如jterrace所说,Java运行时会将结果"包装"到-2147483648的Integer.MIN_VALUE.

但这在数学上是不正确的!正确的数学答案是2147483648.但是'int'的值不能是2147483648.'int'的边界是-2147483648到2147483647

那么Java为什么不抛出异常呢?好问题!一个Array对象会.

但语言作者知道其原始类型的范围,因此他们使用"包装"技术来避免代价高昂的异常.

作为开发人员,您必须测试这些类型边界.一个简单的递增测试就是

if(x++ == Integer.MIN_VALUE)
   //boundary exceeded
Run Code Online (Sandbox Code Playgroud)

一个简单的递减测试就是

if(x-- == Integer.MAX_VALUE)
   //boundary exceeded
Run Code Online (Sandbox Code Playgroud)

两者的完整测试将是

if(x++ == Integer.MIN_VALUE || x-- == Integer.MAX_VALUE)
   //boundary exceeded
Run Code Online (Sandbox Code Playgroud)

  • 在最后一个例子中,我认为你不能使用++和 - 运算符来检查边界,因为它们实际上正在改变x的值.相反应该重构为if(x + 1 == Integer.MIN_VALUE || x - 1 == Integer.MAX_VALUE) (6认同)
  • 等等,为什么不能只检查 x == Integer.MAX_VALUE 而不是 x + 1 == Integer.MIN_VALUE? (2认同)