В математике с фиксированной точкой я использую много 16-битных сигналов и выполняю умножение с промежуточными результатами 32 бит. Например:Целочисленное умножение с подписями и без знака
int16_t a = 16384; //-1.0q14 or 1.0*2^14
int16_t b = -24576; // -1.4q14 or 1.4*2^14
int16_t c; // result will be q14
c = (int16_t)(((int32_t)a * (int32_t)b)>>14);
Допустим, что a - это число q14, то c с тем же масштабом, что и b.
Это нормально и работает как без знака, так и с арифметикой.
Вопрос: Что произойдет, если я буду смешивать типы? Например, если я знаю, что множитель «a» всегда будет варьироваться от 0.0 до 1.0, возникает соблазн сделать его беззнаковым int q15, чтобы получить дополнительный бит точности (и изменить значение сдвига на 15). Тем не менее, я никогда не понимал, что произойдет, если вы попытаетесь размножить подписанные и неподписанные числа в C и избежали этого. В ASM я не помню, что существует многозадачная инструкция, которая будет работать со смешанными типами в любой архитектуре, поэтому даже если C сделает все правильно, я не уверен, что она создаст эффективный код.
Должен ли я продолжать практику без смешивания, подписанного без знака в коде с фиксированной точкой? Или это хорошо работает?
Это сообщение ответит на вопрос, что происходит при умножении целых чисел без знака и без знака. http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe. Короткий ответ заключается в том, что если они имеют одинаковый ранг (размер), подписанный неявным образом присваивается значение unsigned. –
Опубликуйте ответ вместо комментария, чтобы я мог его принять ;-) – phkahler
По какой-то причине в то время я думал, что отвечаю только на часть вашего вопроса, поэтому оставил его в качестве комментария. Теперь, когда я снова смотрю, я не уверен, почему я так думал. Благодаря! –