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