単純に、
n = sizeof(float)*8;
for(i = n; i >= 0; i--){
if((a >> i) & 0x01) printf("1");
else printf("0");
}
で表記できると思ったら、コンパイラに怒られました。
質)floatは、どのようなデータとしてメモリ内にあるのでしょうか?
宜しくお願いします。
エラーって 何のエラーでしょうか?
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
エラーって 何のエラーでしょうか?
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
float の表す値 = (-1)符号部 × 2指数部-127 × 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 という値を指数と呼ぶ.
仮数と指数と(さらに+-の符号と)を用いて表された実数値のことを浮動小数点数と呼ぶ.
浮動小数点方式です。
ANSI Cでは次のような構造になっています。
http://www.hiroshima-cu.ac.jp/japanese/IPC/hunet99/sun/WorkShop/ja/html_docs/c-compiler/user_guide/ANSIC.doc.html
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
#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 さんの回答に対するコメント中にもありますが、浮動小数点型の変数にビットシフトをしようとしたからだと思います。
とあります。意味分かりませんか?
2012/06/30 21:11:48