Long + Long不大于Long.MAX_VALUE

Kau*_*ase 9 java long-integer

如果我有作业

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使用基础上的符号更复杂的个案ab.


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)

  • 投票,最简单,最可读和最好的方式.希望课程不会采用更"优化"的数学方法. (2认同)