如果我有作业
Long c = a + b;
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法来检查a + b是不是大于/小于Long.MAX_VALUE/ Long.MIN_VALUE?
Lou*_*man 17
使用番石榴,就像它一样简单
long c = LongMath.checkedAdd(a, b); // throws an ArithmeticException on overflow
Run Code Online (Sandbox Code Playgroud)
我想,这是非常可读的.(LongMath Javadoc 在这里.)
为了公平起见,我会提到Apache Commons提供的内容ArithmeticUtils.addAndCheck(long, long).
如果你想知道它们是如何工作的,那么答案就是Guava的一点点hackery:如果结果不会溢出(a ^ b) < 0 | (a ^ (a + b)) >= 0.这是基于两个数字的按位异或是非负的技巧,如果它们具有相同的符号.
(a ^ b) < 0如果a并且b有不同的标志,那是真的,如果是这样的话,它永远不会溢出.或者,如果(a ^ (a + b)) >= 0,则a + b具有相同的符号a,因此它不会溢出并变为负数.
(有关这方面的更多技巧,请查看可爱的书籍Hacker's Delight.)
Apache使用基础上的符号更复杂的个案a和b.
T.J*_*der 13
如果它们具有相同的符号(并且两者都是!0),那只是一个问题,因为否则你就不会溢出.如果发生溢出,结果的符号将会翻转.所以:
long r = a + b;
if ( (a < 0 && b < 0 && r >= 0) ||
(a > 0 && b > 0 && r <= 0) ) {
// Overflow occurred
}
Run Code Online (Sandbox Code Playgroud)