人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

c言語で、float型変数の内容を2進数で印字したいです。

単純に、
n = sizeof(float)*8;
for(i = n; i >= 0; i--){
if((a >> i) & 0x01) printf("1");
else printf("0");
}
で表記できると思ったら、コンパイラに怒られました。

質)floatは、どのようなデータとしてメモリ内にあるのでしょうか?

宜しくお願いします。

●質問者: mizore_chan
●カテゴリ:コンピュータ 科学・統計資料
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● きゃづみぃ
●25ポイント ベストアンサー

エラーって 何のエラーでしょうか?

n = sizeof(float)*8; は エラーないですけど?

#include <stdio.h>
 
int main()
{
int n;
int i;
int a;
 
n = sizeof(float)*8;
a=5;
 
for(i = n; i >= 0; i--){
 if((a >> i) & 0x01) { printf("1");}
 else { printf("0");}
}
}


http://ideone.com/bqjt4

足りない部分は テキトーに補っています。


>質)floatは、どのようなデータとしてメモリ内にあるのでしょうか?

float型は4バイトのデータとして保存されます。

内訳は



http://www.cc.kyoto-su.ac.jp/~yamada/pB/float.html


mizore_chanさんのコメント
有難う御座います。 例えば、float型の変数 a=10.5 を2進数表記したいと思い、作ってみたのですが、 f((a >> i) & 0x01)の部分でコンパイラエラーがでました。 ビットフィールドを使って、表示ができたので自己解決はできたのですが 今度はfloatの内部表現で躓いています。係数部の読み方を教えて下さると 助かるのですが。。。 宜しくお願いします。

きゃづみぃさんのコメント
http://rina.jpn.ph/~rance/c_language/p13.html >> 右シフト:>> a>>bで、aの各ビットを"右へbビット分シフト"させる。空いた右のビットには、変数aが"符号なし変数(unsigned intなど)なら0"が、"符号あり変数(intなど)なら符号ビット(一番左のビット)の値"が入る。 << 基本的に intじゃないと使えないんじゃないのかな?

TransFreeBSDさんのコメント
>> float の表す値 = (-1)<sup>符号部</sup> × 2<sup>指数部-127</sup> × 1.仮数部 << とあります。意味分かりませんか?

きゃづみぃさんのコメント
>> 科学計算では非常に大きな実数値や非常に小さな実数値も扱うことがある. そのようなときには,通常の10進数の表記ではなくて,次のような指数表記で表すれば 無駄な 000...000 という桁を表記しなくてもよくなる. 12345678900000000000000000000 = 1.23456789 * 1028 0.00000000000000000000123456789 = 1.23456789 * 10-21 これは,2進数表現でも同じで, 110110100100000000000000000000000 = 1.101101001 * 232 0.00000000000000000000000001101101001 = 1.101101001 * 2-26 と指数表記することができる. このような指数表記の, 1.101101001 という値を仮数,32 および -26 という値を指数と呼ぶ. 仮数と指数と(さらに+?の符号と)を用いて表された実数値のことを浮動小数点数と呼ぶ. <<

2 ● oil999
●10ポイント

浮動小数点方式です。

ANSI Cでは次のような構造になっています。
http://www.hiroshima-cu.ac.jp/japanese/IPC/hunet99/sun/WorkShop/ja/html_docs/c-compiler/user_guide/ANSIC.doc.html


3 ● rsc
●30ポイント

floatは、どのようなデータとしてメモリ内にあるのでしょうか?というのは、上の方のでいいと思いますが、プログラムを見て、ちょっと気になったのは、次の部分です。(^_^;

for(i = n; i >=0; i--)

これだと、n?0まで、この場合、n=4*8=32から0まで、32+1=33回のループになっています。よって、次のように変更した方がいいと思います。

for(i = n-1; i >=0; i--)

※参考URL
http://www.k-cube.co.jp/wakaba/server/floating_point.html


4 ● JULY
●35ポイント
#include <stdio.h>

void bit_dump(int var_size, void *value)
{
 int i, endian_test = 1;
 int offset, diff;
 unsigned char *p, c, mask;

 p = value;

 if (*(char *)&endian_test) {
 /* Little Endian */
 offset = var_size - 1;
 diff = -1;
 } else {
 /* Big Endian */
 offset = 0;
 diff = 1;
 }

 for (i = 0, p += offset; i < var_size; i++, p += diff) {
 c = *p;
 for (mask = 0x80; mask > 0; mask >>= 1) {
 printf("%c", (c & mask) ? '1' : '0');
 }
 }

 puts("\n");
}


int main(int argc, char *argv)
{
 float f = 1.0;

 bit_dump(sizeof(f), &f);

 return 0;
}

一応、リトルエンディアンか、ビッグエンディアンかを識別させてますが、ビッグエンディアンでの実行は確認してません。

エラーが出る理由は、taknt さんの回答に対するコメント中にもありますが、浮動小数点型の変数にビットシフトをしようとしたからだと思います。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ