• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 453
  • Last Modified:

Overflow calculation

Is it possible to write a bit of C code to perform an arithmetical operation and detect overflow without using exceptions, nor surpressing them, and avoiding the use of assembler?

I was thinking about something like

long ratPerformAdd(a,b long, BOOL *overflow) {
    ........
}

where either the sum gets returned or the flag overflow gets set?

I'm looking for a platform independant (but 32 bit) operation which I can use on several machines without resorting to assembler.
0
BigRat
Asked:
BigRat
1 Solution
 
phoffricCommented:
If a*b < 0, then a+b will not overflow
i.e., if a and b have different sign, then no worries about overflow when adding.

If same signs, then if a+b has different sign than b, then overflow.
0
 
BigRatAuthor Commented:
Hmmm, that was not the sort of thing I was looking for, unless one splits the longs into 16 bit quantities and adds them together. Of course I'll need subtraction and multiplication, since division is really no problem.
0
 
phoffricCommented:
>> unless one splits the longs into 16 bit quantities and adds them together.
To do the add, just add the two long values and return the overflow status. No need to split into short ints.
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
phoffricCommented:
Do you want some code for ratPerformAdd?
0
 
jkrCommented:
Would ''matherr()' (http://www.kernel.org/doc/man-pages/online/pages/man3/matherr.3.html - scroll down for an example) be an option?
0
 
phoffricCommented:
>> that was not the sort of thing I was looking for
Here's another addition overflow detection approach:

If both a and b are positive, then overflow if and only if
    a > LONG_MAX - b
since that implies that a + b is greater than the maximum long value

If both a and b are negative, then overflow iff
    a < LONG_MIN - b

Note: these macros are defined in <limits.h>
0
 
phoffricCommented:
For subtraction, just convert to addition and reuse the addition overflow detection scheme.


For multiplication, you have overflow if one arg is INT_MIN and the other is -1.
For other cases, take the absolute values of a and b (call them A and B).

   If you have long long type (i.e., a 64 bit integer), then you test for multiplication overflow:
     long long val64 = A*B;
   and see whether there are excess bits using a mask (i.e., long long mask = ~0x7FFFFFFF)

   Or, if 64 bit integer is not available, then you have an overflow if
      A > INT_MAX/B      or       B > INT_MAX/A



For division, a/b, you have overflow if a == INT_MIN and b = -1. Then a/b = a, but it should be -a.
0
 
BigRatAuthor Commented:
Sorry about the delay, I'm still at home with the flu, but will be back in the office on Monday. meanwhile I think that someting alongs the lines of ID 35168856 will be the solution.
0
 
evilrixSenior Software Engineer (Avast)Commented:
This question has been classified as abandoned and is closed as part of the Cleanup Program. See the recommendation for more details.
0
 
BigRatAuthor Commented:
Sorry, I forgot this question, since I never got around to implementing the code from it.

I have just tried to close this question, but can't. Somehow I'm supposed to generate a cancel auto-close request before I can close it? How complicated!
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now