Представление числа float в двоичной системе - C (СИ)
Формулировка задачи:
Задачка такая - написать программу на
Си
!!!, которой мы задаем число типа float, а она выдает его нам так как его видит компьютер(в двоичной системе?).Решение задачи: «Представление числа float в двоичной системе»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void) {
//Кропаем строку под вывод число типа float в двоичном нужного размера
char* p;
if(!(p= (char*)(malloc (sizeof(float)* 8+ 1))))
printf ("всё плохо");
//выделили строку
//+++++++++++++++++++++++++++++++++++++++++++
//прикол в т том, что я умею перводить в двоичную систему только числа int
//ну или char на крайняк
//но float не int, поэтому я щас сделаю буфер, куда тупо побайтно
//перегоню float
float f = 12.345;
char* p_;
if(!(p_= (char*)(malloc (sizeof(float)))))
printf ("всё плохо");
memmove (p_, &f, sizeof(float));
//теперь в p_ просто набор нужных байт, который я туда перегнал,
// с ним можно работать уже
//кто может обойтись без этого буфера, пусть покажет как
//+++++++++++++++++++++++++++++++++++++++++++
//теперь побайтно с буфером работаем
for (int i= 0; i< (int)sizeof(float); i++) {
//именно (unsigned char) и никак иначе
//каждый байт последжовательности перегоним сюда
unsigned char temp_= (unsigned char)p_[i];
//Это вот специальный буферик, куда мы будем запихивать двоичное представление
//каждого байта
char temp__ [8];
//тут есть несколько способов как переводить int
//в двоичную систему, я выбрал жёсткий
//повторюсь: фактически, мы хоть и работаем с int
//но работаем с ОДНИМ БАЙТОМ
//а состальные байты- нулевые
itoa (temp_, temp__, 2);
//очередная грязь, которая нас поджидает: itoa убирает лидирующие ноли;
int tem= strlen(temp__);
memmove (&temp__ [8- strlen(temp__)], temp__,strlen(temp__));
memset (temp__, '0', 8- tem);
//теперь перегоним содержимое буферика куда надо:
memmove (&p[8* i], temp__, 8);
}
p [sizeof(float)* 8]= 0;
printf ("%s\n", p);
getchar ();
return 0;
}
Объяснение кода листинга программы
- Подключаем необходимые библиотеки
- Объявляем переменную типа float и присваиваем ей значение 12.345
- Объявляем переменную типа char и присваиваем ей значение (char)malloc(sizeof(float))
- Используем memmove для копирования байтов из float в char*
- Используем цикл for для обработки каждого байта из float
- Преобразуем каждый байт в двоичную систему счисления используя itoa и сохраняем результат в отдельный массив
- Перемещаем байты из массива в нужное место в основной строке
- Добавляем нулевой символ в конец основной строки
- Выводим полученную строку на экран
- Ждем нажатия клавиши
- Возвращаем 0, завершая работу программы