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


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

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

宜しくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/07/02 21:14:40
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント25pt

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

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

他2件のコメントを見る
id:TransFreeBSD

float の表す値 = (-1)符号部 × 2指数部-127 × 1.仮数部

とあります。意味分かりませんか?

2012/06/30 21:11:48
id:taknt

科学計算では非常に大きな実数値や非常に小さな実数値も扱うことがある. そのようなときには,通常の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 という値を指数と呼ぶ.

仮数と指数と(さらに+-の符号と)を用いて表された実数値のことを浮動小数点数と呼ぶ.

2012/06/30 21:20:39

その他の回答3件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198ここでベストアンサー

ポイント25pt

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

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

他2件のコメントを見る
id:TransFreeBSD

float の表す値 = (-1)符号部 × 2指数部-127 × 1.仮数部

とあります。意味分かりませんか?

2012/06/30 21:11:48
id:taknt

科学計算では非常に大きな実数値や非常に小さな実数値も扱うことがある. そのようなときには,通常の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 という値を指数と呼ぶ.

仮数と指数と(さらに+-の符号と)を用いて表された実数値のことを浮動小数点数と呼ぶ.

2012/06/30 21:20:39
id:oil999 No.2

回答回数1728ベストアンサー獲得回数320

ポイント10pt

浮動小数点方式です。

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

id:rsc96074 No.3

回答回数4497ベストアンサー獲得回数436

ポイント30pt

 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

id:JULY No.4

回答回数966ベストアンサー獲得回数247

ポイント35pt
#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 さんの回答に対するコメント中にもありますが、浮動小数点型の変数にビットシフトをしようとしたからだと思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません