Comment by nayuki
3 years ago
It is tedious but possible to check for overflow before multiplying signed integers.
long long x = (...);
long long y = (...);
long long z;
// Portable
bool ok = x == 0 || y == 0;
if (!ok) {
long long a = x > 0 ? x : -x;
long long b = y < 0 ? y : -y;
if ((x > 0) == (y > 0))
ok = -LONG_LONG_MAX / a <= b;
else
ok = LONG_LONG_MIN / a <= b;
}
if (ok)
z = x * y;
// Compiler-specific
bool ok = !__builtin_smulll_overflow(x, y, &z);
https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins...
Thanks for that.
Slightly worrying that I didn't come across this or a variation in my searches