在定点数学中,我使用了大量的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);
Run Code Online (Sandbox Code Playgroud)
让我们说a是q14数,然后c与b具有相同的比例.
这很好,适用于无符号和带符号的算术.
问题是:如果我要混合类型会发生什么?例如,如果我知道乘数"a"总是在0.0到1.0的范围内,那么很容易使它成为无符号整数q15以获得额外的精度(并将移位计数更改为15).但是,我从未理解如果你试图在C中乘以有符号和无符号数并避免它会发生什么.在ASM中,我不记得在任何架构上都存在可以与混合类型一起使用的乘法指令,所以即使C做了正确的事情,我也不确定它会生成有效的代码.
我是否应该继续不在定点代码中混合签名的无符号类型?或者这可以很好地工作吗?