在定点数学中,我使用了很多 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,那么很容易将其设为 unsigned int q15 以获得额外的精度(并将移位计数更改为 15)。但是,我从来不明白如果您尝试在 C 中将有符号和无符号数字相乘并避免它会发生什么。在 ASM 中,我不记得有一个可以在任何架构上处理混合类型的乘法指令,所以即使 C 做了正确的事情,我也不确定它是否会生成高效的代码。
我应该继续在定点代码中不混合有符号和无符号类型的做法吗?或者这可以很好地工作吗?