Нет, вам нужно перейти на 32 бит.В общем случае произведение двух 16-битных чисел всегда даст вам 32-битный результат.
Вам следует проверить набор команд ЦП того ЦПУ, над которым вы работаете, потому что большинство команд умножения на 16-битных машинах имеют возможность возвращать результат в виде 32-битного целого числа напрямую.
Этоочень поможет вам, потому что:
short testfunction (short a, short b)
{
int A32 = a;
int B32 = b;
return A32*B32/1000
}
заставит компилятор сделать 32-битное * 32-битное умножение.На вашей машине это может быть очень медленным или даже выполнено в несколько шагов с использованием только 16-битных умножений.
Немного встроенной сборки или, что еще лучше, встроенная компилятор может значительно ускорить процесс.
Вот пример для Texas Instruments C64x + DSP с такими характеристиками:
short test (short a, short b)
{
int product = _mpy (a,b); // calculates product, returns 32 bit integer
return product / 1000;
}
Еще одна мысль: вы делите на 1000. Была ли эта константа вашим выбором?Было бы намного быстрее использовать степень двух в качестве основы для ваших чисел с фиксированной точкой.1024 близко.Почему бы вам:
return (a*b)/1024
вместо этого?Компилятор может оптимизировать это, используя сдвиг вправо на 10 бит.Это должно быть намного быстрее, чем делать трюки с взаимным умножением.