[H8-ML(2425)] Re: C言語での掛け算について
From: Kosaka Toshifumi <kosaka@xxxxxxxxxxxxxx>
Date: 2002年11月24日(日)19時08分44秒
こんにちは,小坂です。

澤さんがご指摘の通り,
0x745dはshort intと解釈されます。
そうすると
temp1 = input_data * 0x745d;
は
(unsigned short int)×(unsigned short int) の結果を(unsigned short int)として右辺を計算し(これは正しく計算されません),左辺の(unsigned long int)に代入されます。
その結果temp1(32ビット)は上位16ビットが0になっています。

ここは変数をキャストして32ビット同士の掛け算である点を示して
temp1 = (unsigned long)input_data * 0x745dL
と書いておくのが誤りが少ないと思います。

なお
outb(H8DAC + H8DAC_DADR0, (unsigned char)(input_data >> 21));
は
outb(H8DAC + H8DAC_DADR0, (unsigned char)(temp1 >> 21));
なのかな?

さてもう一点気になるのは,
input_dataですが,入力直後は0000〜FFC0の範囲のデータがあるはずです
input_data = input_data >> 1;
を施しますので
input_dataには0000〜7FE0の範囲のデータがあるはずです。
もし,キャストして正しく掛け算が行なわれたら,temp1には
00000000〜3A1FF460のデータが入ることになります
これを21ビット右シフトすると
00000000〜000001D0
になります。これをunsigned charにキャストすると1ビット欠けがでると思いますが?
入力のダイナミックレンジを半分程度しか使用していないのなら,このままでよいのかもしれませんが気になりましたので。


****************************************************
〒193 0997 八王子市椚田町1220-2 東京工業高等専門学校
情報工学科 小坂敏文 phone0426-68-5199 Fax68-5098

スレッド概略
[2423(R)](起点)
 └[表示中]
   └[2432(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]