在固定点数学中,我使用了许多16位信号,并使用32位中间结果进行乘法运算。例如:
假设a是一个q14数字,那么c将与b具有相同的缩放比例。这对于无符号和有符号算术都适用。
问题是:如果我混合使用类型会发生什么?例如,如果我知道乘数"a"的范围始终从0.0到1.0,那么让它成为无符号整数q15以获得额外的精度(并将移位计数更改为15)是很诱人的。然而,我从来没有理解过在C中尝试将有符号和无符号数字相乘会发生什么,并且一直避免这样做。在ASM中,我不记得有任何体系结构上可以使用混合类型的乘法指令,因此,即使C做正确的事情,我也不确定它是否会生成高效的代码。
在定点代码中,我应该继续遵循不混合使用有符号和无符号类型的做法吗?或者这样做可以很好地工作?
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,那么让它成为无符号整数q15以获得额外的精度(并将移位计数更改为15)是很诱人的。然而,我从来没有理解过在C中尝试将有符号和无符号数字相乘会发生什么,并且一直避免这样做。在ASM中,我不记得有任何体系结构上可以使用混合类型的乘法指令,因此,即使C做正确的事情,我也不确定它是否会生成高效的代码。
在定点代码中,我应该继续遵循不混合使用有符号和无符号类型的做法吗?或者这样做可以很好地工作?