いいえ、32ビットに移動する必要があります。一般に、2つの16ビット数の積は常に32ビット幅の結果をもたらします。
16ビットマシンのほとんどの乗算命令には、結果を32ビット整数として直接返すオプションがあるため、作業中のCPUのCPU命令セットを確認する必要があります。
これは次の理由で大いに役立ちます。
short testfunction (short a, short b)
{
int A32 = a;
int B32 = b;
return A32*B32/1000
}
コンパイラに32ビット*32ビットの乗算を強制します。お使いのマシンでは、これは非常に遅いか、16ビット乗算のみを使用して複数のステップで実行される可能性があります。
少しのインラインアセンブリ、またはさらに優れたコンパイラ組み込み関数を使用すると、処理速度が大幅に向上する可能性があります。
このような組み込み関数を持つTexasInstrumentsC64x+DSPの例を次に示します。
short test (short a, short b)
{
int product = _mpy (a,b); // calculates product, returns 32 bit integer
return product / 1000;
}
別の考え:あなたは1000で割っています。それはあなたの選択で一定でしたか?固定小数点数のベースとして2の累乗を使用する方がはるかに高速です。1024が近いです。どうしてですか:
return (a*b)/1024
代わりは?コンパイラーは、右シフトを10ビット使用することでこれを最適化できます。これは、逆数の乗算トリックを実行するよりもはるかに高速である必要があります。