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