Учитывая два числа a, b, и каждое число использует биты len_a и len_b.
Ваш выходной тип данных должен содержать как минимум: len_a и len_b бит.
В приведенном выше коде у вас есть два 31-битных числа (потому что INT_MAX - 1 = 0x7FFFFFFE использует 31 бит), и вам нужно будет типизировать один из них в int64_t, потому что он будет делать 32-битное умножение и переполнение, прежде чем он будет приведен к int64_t.
Количество битов, необходимых для умножения с фиксированной запятой:
len_output = howManyBits( a * b )
= len_a + len_b
Краткий пример, демонстрирующий приведенное выше правило в действии:
a = 7
len_a = 3
b = 7
len_b = 3
c = a * b
= 49 ( decimal )
= 0x31 ( hex )
len_c = howManyBits( 0x31 )
= 6
Вы можете написать функцию для подсчета битов. Или, если вам нужна быстрая проверка работоспособности, чтобы подтвердить это, используйте что-то вроде Windows Calc, которое преобразует число в двоичную форму и подсчитывает используемые биты.