Как умножить два целых числа со знаком, используя длинное умножение, обнаружение потери значимости и переполнения - PullRequest
0 голосов
/ 03 августа 2020
• 1000 Я не хочу использовать тип большего размера, чем у целых чисел со знаком, с которых я начинаю. Я хочу использовать подход длинного умножения. Я не хочу использовать оператор деления.

Я нашел этот пример:

BOOL umull_overflow3(unsigned long lhs, unsigned long rhs, unsigned long* result)
{
        const unsigned long HALFSIZE_MAX = (1ul << LONG_BIT/2) - 1ul;
        unsigned long lhs_high = lhs >> LONG_BIT/2;
        unsigned long lhs_low  = lhs & HALFSIZE_MAX;
        unsigned long rhs_high = rhs >> LONG_BIT/2;
        unsigned long rhs_low  = rhs & HALFSIZE_MAX;

        unsigned long lowbits = lhs_low * rhs_low;
        if (!(lhs_high || rhs_high)) {
            *result = lowbits;
            return 0; 
        }
        BOOL overflowed = lhs_high && rhs_high;
        unsigned long midbits1 = lhs_low * rhs_high;
        unsigned long midbits2 = lhs_high * rhs_low;
        unsigned long midbits  = midbits1 + midbits2;
        overflowed = overflowed || midbits < midbits1 || midbits > HALFSIZE_MAX;
        unsigned long product = lowbits + (midbits << LONG_BIT/2);
        overflowed = overflowed || product < lowbits;

        *result = product;
        return overflowed;
}

из ответа на этот вопрос: Поймать и вычислить переполнение при умножении двух больших целых чисел

Хотелось бы понять, как написать аналогичную функцию для целых чисел со знаком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...