6

固定小数点演算では、多くの 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 が正しいことを行ったとしても、効率的なコードが生成されるかどうかはわかりません。

固定小数点コードに符号付きと符号なしの型を混在させないという慣行を続けるべきですか? または、これはうまく機能しますか?

4

2 に答える 2

6

この投稿では、符号付き整数と符号なし整数を乗算するとどうなるかについて説明しています。簡単な答えは、それらが同じランク (サイズ) である限り、符号付きは暗黙的に符号なしに型キャストされるということです。

型キャスト規則 (プログラミングに使用している言語に関係なく) を理解しているか、明示的な型キャストを使用し、符号付きから符号なしへの型キャストの意味を理解している限り (負の数は、署名された値)、署名された型と署名されていない型を混在させても問題はありません。

于 2013-06-11T00:24:23.123 に答える