• ベストアンサー

共有体でfloat型の数値を2進数へ変換

実行結果が思ったとおりの値を算出しません。 なぜでしょうか? 回答のほどよろしくお願いいたします。 (例) 小数入力 >5.0 0000 0000 0000 0000 0100 0000 1010 0000 小数入力 >-5.0 0000 0000 0000 0000 1100 0000 1010 0000 (下記ソース) #include<stdio.h> void float_binary(float a); void main (void) { float fl; printf("小数入力 >"); scanf("%f",&fl); float_binary(fl); } void float_binary(float a) { struct float_data{ short int high_byte; short int low_byte; }; union data{ float num; struct float_data bit; }DATA; int i; DATA.num = a; for(i = 0; i<16; i++){ if(i != 0 && i % 4 == 0){ printf(" "); } if(DATA.bit.high_byte < 0){ printf("1"); } else{ printf("0"); } DATA.bit.high_byte = DATA.bit.high_byte << 1; } for(i = 0; i<16; i++){ if(i % 4 == 0){ printf(" "); } if(DATA.bit.low_byte < 0){ printf("1"); } else{ printf("0"); } DATA.bit.low_byte = DATA.bit.low_byte << 1; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>私の納得のいく結果 >0000 0001 0000 0000 0000 0000 0000 0100 >私の認識が間違っているのでしょうか? はい、間違いです。 #2でも言及したように、質問文でのfloatは、 符号1ビット、指数部8ビット(127のゲタ履き)、仮数部23ビット(最左のビット省略)になっています。 4の場合指数部は、10000001で129 仮数部は1(2進)ですが、最左ビットが省略されているので、1のビットは実質見えません。なぜ省略できるかというと、指数部で桁を調整するからです。 指数部の129は、127を0としてプラスマイナスを表現するので、+2(つまり2ビット左シフト) 5の場合もそうなっていることがわかると思います。

yukikundesuyo
質問者

お礼

回答ありがとうございます。 昔、基本情報技術者を取得したときに勉強したIEEEの浮動小数点形式だということを本で調べて、見つけました。すっかり忘れていたようです。 また改めて勉強できたのでいい機会でした。 BLUEPIXYさんのおかげです。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

どう思った値と違うのでしょう? 質問文でのfloatの形式は 符号1ビット、指数部8ビット(127のゲタ履き)、仮数部23ビット(最左のビット省略)になっていると思います。(#1の方が指摘しているように、インテル系では並びが逆になるが) short int2つを止めて、単純にlongあるいはint(32ビット)でやってみてもいいかと思いますが。

yukikundesuyo
質問者

補足

回答ありがとうございます。 #1の方の言うとおり行うとintの形式の入力データをshort int2つに分けて行うと納得のいく結果が出力できましたが、float型の方が納得いきません。 (ソース実行結果) 小数入力 >4 0100 0000 1000 0000 0000 0000 0000 0000 (私の納得のいく結果) 小数入力 >4 0000 0001 0000 0000 0000 0000 0000 0100 どうすれば上記の納得のいく結果を出力できるのでしょうか? それとも私の認識が間違っているのでしょうか? 回答のほどよろしくお願いいたします。

  • MetalKing
  • ベストアンサー率57% (15/26)
回答No.1

struct float_data{ short int low_byte; short int high_byte; }; でしょう

yukikundesuyo
質問者

補足

回答ありがとうございます。 MetalKingさんの言うとおり行うとintの形式の入力データをshort int2つに分けて行うと納得のいく結果が出力できましたが、float型の方が納得いきません。 (ソース実行結果) 小数入力 >4 0100 0000 1000 0000 0000 0000 0000 0000 (私の納得のいく結果) 小数入力 >4 0000 0001 0000 0000 0000 0000 0000 0100 どうすれば上記の納得のいく結果を出力できるのでしょうか? それとも私の認識が間違っているのでしょうか? 回答のほどよろしくお願いいたします。

関連するQ&A