#include <stdio.h>

show32(void *p, int isfloat)
{
	unsigned int ui = *(unsigned int *)p;
	int n;
	
	for( n = 31; n >= 0; n--) {
		printf((ui & (1u << n))?"1":"0");
		if( isfloat ) {
			if ( n == 31 || n == 23 ) {
				printf(" ");
			}
		} else {
			if( n % 4 == 0 ) {
				printf(" ");
			}
		}
	}
	printf("\n");
}

show64(void *p, int isfloat)
{
	unsigned long long ull = *(unsigned long long *)p;
	int n;
	
	for( n = 63; n >= 0; n--) {
		printf((ull & (1ull << n))?"1":"0");
		if( isfloat ) {
			if ( n == 63 || n == 52 ) {
				printf(" ");
			}
		} else {
			if( n % 4 == 0 ) {
				printf(" ");
			}
		}
	}
	printf("\n");
}

showsize()
{
	printf("sizeof(int) = %d\n", sizeof(int));
	printf("sizeof(long) = %d\n", sizeof(int));
	printf("sizeof(long long) = %d\n", sizeof(long long));
	printf("sizeof(float) = %d\n", sizeof(float));
	printf("sizeof(double) = %d\n", sizeof(double));
}

main()
{
	unsigned int sinf, sninf, smax, snmax, szero, snzero, smin, snmin;
	unsigned long long dinf, dninf, dmax, dnmax, dzero, dnzero, dmin, dnmin;

	/* 32 bits */
	int i1, i2, i3;
	unsigned int ui1, ui2, ui3;
	float f1, f2, f3;

	/* 64 bits */
	long long ll1, ll2, ll3;
	unsigned long long ull1, ull2, ull3;
	double d1, d2, d3;

	i1 = -2000000;
	printf("3.3 -2,000,000 -> 32-bit 2's complement binary:\n");
	show32(&i1, 0);

	i2 = 0x7fffffef;
	printf("3.6 0111 1111 1111 1111 1111 1111 1110 1111 -> decimal:\n");
	printf("%d\n", i2);

	f1 = 20;
	d1 = 20;
	printf("3.37 single floating 20, double floating 20:\n");
	show32(&f1, 1);
	show64(&d1, 1);

	f2 = 0.1;
	d2 = 0.1;
	printf("3.39 single floating 0.1, double floating 0.1:\n");
	show32(&f2, 1);
	show64(&d2, 1);

	f3 = -5;
	f3 /= 6;
	d3 = -5;
	d3 /= 6;
	printf("3.40 single floating -5/6, double floating -5/6:\n");
	show32(&f3, 1);
	show64(&d3, 1);

	/*
	showsize();

	float special value:
	sinf = 0x7f800000;
	sninf = 0xff800000;
	smax = 0x7f7fffff;
	snmax = 0xff7fffff;
	szero = 0x00000000;
	snzero = 0x80000000;
	smin = 0x00800000;
	snmin = 0x80800000;
	*/
}

