Efficient detection of signed overflow?
Florian Weimer
fw@deneb.enyo.de
Fri Dec 4 19:32:00 GMT 2009
* Andrew Haley:
> The test was, if I recall correctly
>
> x = a + b;
> if ((x ^ a) & (x ^ b)) < 0)
>
> all you have to do is convert everything to unsigned values, then
>
> ux = ua + ub;
> if ((ux ^ ua) & (ux ^ ub)) & (unsigned)INT_MIN))
> goto deal_with_overflow;
> // we now know there is no overflow
> x = ux;
>
> which is exactly the same test as before, but perfectly compliant.
The comment is wrong. The code checks for signed overflow, but the
following assignment still overflwos when ux is larger than INT_MAX.
So this version is usable exactly under the same circumstances as the
first one.
And the comparison against 0 results in tighter code. 8-)
More information about the Gcc-help
mailing list