The C standard says that overflow in arithmetic is undefined.
I would like to know how to implement wraparound arithmetic in a performance-friendly way. This means that overflow checking solutions like presented here are not an option (as they slow the operation by about an order of magnitude).
I assume the solution would involve writing an assembly routine to do this. Is there a library available that does this (preferably for multiple architecture, although x86 is a must)?
Alternatively, is there a compiler flag (for gcc & clang) that makes the compiler enforce wraparound semantics for integer arithmetic?
Signed overflow is undefined. Unsigned overflow wraps. Implementing signed wraparound arithmetic is mostly a matter of doing everything in unsigned math. There are a few things to be careful about, though:
unsigned short
andunsigned char
arithmetic works by converting the operands to eitherint
orunsigned int
first. Usuallyint
, unless you're on a weird setup whereint
doesn't have enough range to store allunsigned short
values. That means that convertingshort
orchar
tounsigned short
orunsigned char
for arithmetic can still produce signed integer overflow and UB. You need to do your math inunsigned int
or larger to avoid this.Alternatively, if you want to go the compiler flag route,
-fwrapv
makes signed overflow wrap for addition, subtraction, and multiplication on GCC and Clang. It doesn't do anything aboutINT_MIN / -1
, though.