умножение с фиксированной точкой без временного 64-битного

Привет Я реализую некоторые математические вещи с фиксированной точкой для встроенных систем, и я пытаюсь сделать умножение двух чисел с фиксированной точкой 16.16 без создания 64-битного временного. До сих пор вот код, который я придумал, генерирует наименьшие инструкции.

int multiply(int x, int y){ int result; long long temp = x; temp *= y; temp >>= 16; result = temp; return result; } 

проблема с этим кодом заключается в том, что он использует временное 64-битное целое число, которое, похоже, создает плохой код сборки. Я пытаюсь создать систему, которая использует два 32-битных целых числа вместо 64-битного. Кто-нибудь знает, как это сделать?

    Подумайте о своих цифрах, каждый из которых состоит из двух больших «цифр».

      AB x CD 

    «Базой» цифр является 2 ^ бит_ширина, т. Е. 2 ​​^ 16 или 65536.

    Таким образом, продукт

     D*B + D*A*65536 + C*B*65536 + C*A*65536*65536 

    Однако, чтобы заставить продукт смещаться на 16, вам нужно разделить все эти условия на 65536, поэтому

     D*B/65536 + D*A + C*B + C*A*65536 

    В C:

     uint16_t a = x >> 16; uint16_t b = x & 0xffff; uint16_t c = y >> 16; uint16_t d = y & 0xffff; return ((d * b) >> 16) + (d * a) + (c * b) + ((c * a) << 16); 

    Подписанная версия немного сложнее; часто проще выполнять арифметику по абсолютным значениям x и y а затем фиксировать знак (если вы не переполняете, что вы можете проверить довольно утомительно).