固定小数点演算では、多くの 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 が正しいことを行ったとしても、効率的なコードが生成されるかどうかはわかりません。
固定小数点コードに符号付きと符号なしの型を混在させないという慣行を続けるべきですか? または、これはうまく機能しますか?