在Java中,当你将int(或byte/short/long)增加到超出它的最大值时会发生什么?它是否包含最大负值?
是否AtomicInteger.getAndIncrement()
也处于同样的方式?
Ted*_*opp 62
内置整数运算符不以任何方式指示溢出或下溢.
结果由语言指定,并且独立于JVM版本:Integer.MAX_VALUE + 1 == Integer.MIN_VALUE
和Integer.MIN_VALUE - 1 == Integer.MAX_VALUE
.其他整数类型也是如此.
原子整数对象(AtomicInteger
,AtomicLong
等)在内部使用普通的整数运算符,因此getAndDecrement()
等也表现出这种方式.
jte*_*ace 11
如果您这样做:
int x = 2147483647;
x++;
Run Code Online (Sandbox Code Playgroud)
如果您现在打印出来x
,它将具有该值-2147483648
.
正如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)