float型変数をバイナリダンプ&プリティープリント
IEEE754単精度浮動小数点数をバイナリダンプするプログラム。リトルエンディアンのみで使えます。
/* * 単浮動小数点数をバイナリダンプするプログラム。 * リトルエンディアン専用。 */ #include<stdio.h> void sedump(int s, int e, float x) { // float型変数x左からsバイト目からeバイト目までをダンプする。 // リトルエンディアンでのfloatの表現(気がつかなくてデバッグに時間かかった・・) // 24 --> 31 16 -->23 8 --> 15 0 --> 7 bit目 // ------------------------------------- // | | | | | // ------------------------------------- // メモリ番地 小 --> 大 char *cs = &x; // 浮動小数点をchar[4]とすることでシフト演算を可能にする int i; for(i=s; i<=e; i++){ int boolean = (cs[3 - i/8] >> (7 - i % 8)) & 1; printf("\033[31m%c\033[00m", boolean? '1':'0'); //printf("%c", boolean ? '1':'0'); } } void dumpfloat(float x) { // 全ビットのダンプ printf("all\t: "); sedump(0, 31, x); printf("\n"); // 符号をダンプ printf("sign\t: "); sedump(0, 0, x); printf("\t(1:- 0:+)\n"); // 指数部をダンプ printf("exp\t: "); sedump(1,8, x); printf("\t(bias 127)\n"); // 仮数部をダンプ printf("frac\t: "); printf("(hidden)1. "); sedump(9,31, x); printf("\n"); } int main() { float f; printf("input f: "); scanf("%f", &f); printf("*** internal representation of %f (IEEE 754)***\n", f); dumpfloat(f); printf("\n"); return 0; }
バイナリ文字列は赤で表示されます。
実行結果
$ ./a.out input f: -128.0 *** internal representation of -128.000000 (IEEE 754)*** all : 11000011000000000000000000000000 sign : 1 (1:- 0:+) exp : 10000110 (bias 127) frac : (hidden)1. 00000000000000000000000 $ ./a.out input f: 0.1 # 2進数で循環小数になる数 *** internal representation of 0.100000 (IEEE 754)*** all : 00111101110011001100110011001101 sign : 0 (1:- 0:+) exp : 01111011 (bias 127) frac : (hidden)1. 10011001100110011001101