ページ 11

バイナリの計算について

Posted: 2012年4月26日(木) 13:17
by 田中太朗
初心者なのですが失礼します。
バイナリを読み込み合計して10進数で平均を
表示するプログラムを作成しています。

例えば、0xA2,0xF3,0xBD,0xD3,0x8F,0xD0
というバイナリデータがあるとして
10進数では、162,243,189,211,143,208なので
総和平均は192.666667となります。

以下のプログラムを考えたのですが、実行結果は
A2 F3 BD D3 8F D0 484 192
となります。
平均は小数点以下6桁まで表示したいのですが、
%fで表示した場合
A2 F3 BD D3 8F D0 484 0.000000
となってしまいます。
0.000000→192.666667と表示させたいのですが、
バイナリの計算に詳しい方教えて下さい。

コード:

#include <stdio.h>
#include<math.h>
#include<stdlib.h>
int main(void)
{
  FILE *fp1;
  unsigned char buf[6];
  unsigned short buf2[1];
  int  i;
  char st1[64];

  printf("ファイル名を入力してください\n");
	gets(st1);
	printf("よみこんだんよ\n");

  fp1 = fopen( st1, "r" );
  if( fp1 == NULL ){
    printf( "%sファイルがありません", st1 );
	getchar();
    return -1;
  }
 
  fread( buf, 1, 6, fp1 );
  for(i=0;i<6;i++){
  printf("%02X ",buf[i]);//読み込まれているか確認
  }

  buf2[0]=buf[0]+buf[1]+buf[2]+buf[3]+buf[4]+buf[5];
  printf("%02X ",buf2[0]);//合計
  buf2[0]=buf2[0]/6;
  printf("%02d",buf2[0]);//平均

  fclose( fp1 );
  getchar();
  return 0;
}

Re: バイナリの計算について

Posted: 2012年4月26日(木) 13:32
by beatle
バイナリの計算というか普通の変数の計算ですよね。
buf2はshort型の配列ですから(ところでどうして配列なのでしょうか)、buf2[0]/6は整数/整数となり、小数点以下は切り捨てられます。
これは普通の変数の計算の仕組みですから、バイナリ云々とは無関係です。

浮動小数点の範囲で割り算を行いたいなら
buf2[0] / 6.0
などと書けばOKです。

ただし、
buf2[0] = buf2[0] / 6.0;
と修正したところで、buf2[0]は整数型ですから代入の段階で切り捨てが発生します。