Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
union sample {
int m;
float n;
char ch;
} u;
char* intBits(int x, int mode);
int bitsInt(char buffer[37]);
char* floatBits(double x, int mode);
float bitsFloat(char buffer[37]);
char* spaceBuffer(char buffer[37]);
int main(void) {
printf("Size of union = %lu bytes\n", sizeof(u));
printf("Size of int = %d bytes\n", sizeof(int));
printf("Size of float = %d bytes\n", sizeof(float));
puts("");
printf("int test: %d\n", bitsInt(intBits(25, 1)));
printf("bitsFloat test : %lf\n", bitsFloat(floatBits(45.45, 1)));
puts("");
u.m = 25;
printf("%10s = %s\n", "u.m int", intBits(u.m, 0));
printf("%10s = %s\n", "u.m float", floatBits(u.m, 0));
puts("");
u.n = (float)45.45;
printf("%10s = %s\n", "u.m int", intBits(u.m, 0));
printf("%10s = %s\n", "u.m float", floatBits(u.n, 0));
puts("");
u.m = 26;
printf("%10s = %d\n", "u.m int", u.m);
printf("%10s = %lf\n", "u.m float", u.n);
puts("");
u.m = 84;
printf("%10s = %d\n", "u.m int", u.m);
printf("%10s = %lf\n", "u.m float", u.n);
puts("");
}
// if mode == 0, bit output will be formatted with spaces
// changes an int into bits
char* intBits(int x, int mode) {
// 8 bits per byte at 4 bytes plus 4 spaces and a '\0' is 37 characters
static char buffer[37];
memset(buffer, 0, sizeof(buffer));
unsigned int mask = 1 << 31;
for (unsigned int i = 0; i < 32; ++i) {
sprintf(&buffer[i], "%c", x & mask ? '1' : '0');
x <<= 1;
}
if (mode == 0) {
spaceBuffer(buffer);
}
return buffer;
}
// changes bits into an int
int bitsInt(char buffer[37]) {
return (int) strtol(buffer, NULL, 2);
}
// changes float into bits
char* floatBits(double x, int mode) {
static char buffer[37];
memset(buffer, 0, sizeof(buffer));
// 1 sign bit
if (x < 0) {
sprintf(buffer, "%c", '1');
x *= -1;
}
else {
sprintf(buffer, "%c", '0');
}
// 8 exponent bits
int whole = (int)floor(x);
char wholeBits[100];
strcpy(wholeBits, intBits(whole, 1));
int wholeBitsSize = 0;
while (wholeBits[wholeBitsSize] != '1') {
++wholeBitsSize;
}
++wholeBitsSize;
int exponent = 32 - wholeBitsSize + 127;
strcpy(&buffer[1], &intBits(exponent, 1)[24]);
// 23 mantissa bits = whole bits + fractional bits
strcpy(&buffer[9], &wholeBits[wholeBitsSize]);
double fractional = x - floor(x);
for (int i = exponent - 127; i < 23; ++i) {
fractional *= 2;
if (fractional > 1) {
buffer[9 + i] = '1';
fractional -= 1;
}
else {
buffer[9 + i] = '0';
}
}
if (mode == 0) {
spaceBuffer(buffer);
}
return buffer;
}
// changes bits into a float
float bitsFloat(char buffer[37]) {
// 1 sign bit
int sign = 1;
if (buffer[0] == '1') {
sign *= -1;
}
// 8 exponent bits
char expBuffer[8];
strncpy(expBuffer, &buffer[1], 8);
int exponent = strtol(expBuffer, NULL, 2) - 127;
// 23 matissa bits = whole bits + fractional bits
char wholeBuffer[100];
if (exponent > 0) {
wholeBuffer[0] = '1';
}
else {
wholeBuffer[0] = '0';
}
strncpy(&wholeBuffer[1], &buffer[9], exponent);
int whole = strtol(wholeBuffer, NULL, 2);
float fractional = 0;
int mult = 2;
for (int i = exponent; i < 23; ++i) {
if (buffer[9 + i] == '1') {
fractional += (float)1 / mult;
}
mult *= 2;
}
fractional += whole;
fractional *= sign;
return fractional;
}
// provides bit space formating for readability
char* spaceBuffer(char buffer[37]) {
char tempBuffer[100];
for (int i = 4; i < 37; i += 5) {
strcpy(tempBuffer, &buffer[i]);
buffer[i] = ' ';
strcpy(&buffer[i + 1], tempBuffer);
}
return buffer;
}
Output: