unsigned の小さな値を、それよりも大きな FIXEDVAL型の値に変更する場合、通常はユーティリティー関数のfixedutil_unsigned_tolarge 等を使用します。
例1.unsigned short型の変数を FIXEDVAL型変数に変換する場合
fixedutil_unsigned_tolarge(pval,SIZE,(PFIXEDVAL )&ushortval,sizeof(short ));
または、
fixedutil_setulval32(pval,SIZE,(unsigned long )ushortval);
値のセット自体は簡単な処理なので、上記の関数を次のような独自の処理に置き換える事ができます。
例2.
*(unsigned short *)pval = ushortval;
memset(pval + sizeof(short ),0,width - sizeof(short ));
signed の場合は符号拡張の操作が必要になります。
例3.short型の変数を FIXEDVAL型変数に変換する場合
*(short *)pval = shortval;
if (shortval >= 0)
memset(pval + sizeof(short ),0,width - sizeof(short ));
else
memset(pval + sizeof(short ),0xff,width - sizeof(short ));
Microsoft Visual C++ では、/Oi(または /O2 か /Ox)を指定すると、memset 、memcpy 等がインライン展開されます(他のコンパイラの場合は仕様が異なる可能性があるので注意)。
例2 、例3 は関数呼び出しのオーバーヘッドを削減する事になります。これは比較的小さな改善なので、あまり大きな効果は期待できません。この改善を有効なものにするには、前後の計算処理を絡めて考える必要があるでしょう。