Issue
In C unsigned integer arithmetic wraps around on overflow and signed arithmetic is undefined on overflow. I would like to have 64 bit integer arithmetic (+,-,*) so that on overflow the result is the lowest 64 bits. Is this possible?
I don’t want a wrapped around result. What I am looking is equivalent to casting the integers to 128 bit types, performing the operation, taking the lowest 64 bits and casting back to the 64 bit type.
Solution
Cast the operands to the unsigned type (of the same size) first, perform the operation, then cast back to the signed type.
It's easy to prove for +
and -
. Wasn't certain about *
, but it also seems to give the correct result.
GCC and Clang also have __builtin_{add,sub,mul}_overflow
, which always wrap around, and also report whether or not an overflow occured. They work with any integer type.
int a = 10, b = 20, result;
bool overflowed = __builtin_add_overflow(a, b, &result);
Answered By - HolyBlackCat Answer Checked By - Gilberto Lyons (WPSolving Admin)