こんにちは,小坂です。 澤さんがご指摘の通り, 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