Efficient detection of signed overflow?

Andrew Haley aph@redhat.com
Fri Dec 4 19:48:00 GMT 2009


Florian Weimer wrote:
> * 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.

Ahhh, I see.  Hmm, there must be a decent way to do this.

> And the comparison against 0 results in tighter code. 8-)

Heh.

Andrew.



More information about the Gcc-help mailing list