- ベストアンサー
浮動小数点表現
浮動小数点表現の問題で以下の実行結果を元にfloat型変数 f に与えた実数の実際に格納されているビット列を表示するプログラムを作りたいのですが、 #include<stdio.h> main() { float a; scanf("%f",&a); printf("%f",a); } この程度までしか作れません。ポインタを使ってアドレスを表示することは分るのですが…。 どなたか教えていただけると助かります。 実行結果 Size of Float : 4 byte Size of Int : 4 byte f=0.500000000000000 00111111000000000000000000000000
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
単精度浮動小数点数のバイナリー表示するには、 float型の変数を符号なし整数として扱う必要があると思います。 型変換するのではなく、そのまま読みかえるわけです。 C言語には、共用体(union) というのがあります。 まず、これを調べてください。 整数として読めれば、上位ビットから順に0、1を 調べて表示すればよいわけです。 このためには、マスクといテクニックとビットシフトが 有効です。 がんばってください。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
環境が不明である以上 float と unsigned の大きさが等しいという仮定は危険ではないでしょうか>#3. 面倒でも unsigned char i[sizeof(float)]; とすべきだと思います. もっといえば limits.h を #include して CHAR_BIT を使うべき.
- yaemon_2006
- ベストアンサー率22% (50/220)
カテ違い。 #include <stdio.h> union bits{ float f; unsigned i; }; int main(void) { union bits f_i; int i; scanf("%f", &f_i.f); printf("%f\n", f_i.f); for(i = 31; i >= 0; -- i) printf("%d", (f_i.i >> i) & 1); return 0; }
- Tacosan
- ベストアンサー率23% (3656/15482)
なんとかして f の各バイトの値を得る必要がある, ということはいいでしょうか? そのためには ・unsigned char の配列との union ・unsigned char * へのアドレスのキャスト のどちらかをすることになります. 得られればシフトとかマスクとかすれば OK. ただし, 処理系によってはその通りの結果が得られない可能性があるのでそこは気を付けてください.