If I have an assignment
Long c = a + b;
Is there an easy way to check that a + b is not bigger/smaller than Long.MAX_VALUE/Long.MIN_VALUE?
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
Using Guava, it’s as simple as
which is, I’d like to think, very readable indeed. (LongMath Javadoc here.)
For the sake of fairness, I’ll mention that Apache Commons provides
ArithmeticUtils.addAndCheck(long, long).If you want to know how they work, well, the answer is one line of bit-hackery for Guava: the result doesn’t overflow if
(a ^ b) < 0 | (a ^ (a + b)) >= 0. This is based on the trick that the bitwise XOR of two numbers is nonnegative iff they have the same sign.So
(a ^ b) < 0is true ifaandbhave different signs, and if that’s the case it’ll never overflow. Or, if(a ^ (a + b)) >= 0, thena + bhas the same sign asa, so it didn’t overflow and become negative.(For more tricks like this, investigate the lovely book Hacker’s Delight.)
Apache uses more complicated casework based on the sign of
aandb.