Перейти к содержанию
    

Сохранение вещественного числа побайтно в память

Кто сталкивался, подскажите аль поделитесь идеями, как красиво сохранить вещественне число побайтно в память, в какую - это уже аппаратный вид реализации.

Язык Си.

 

Сам могу предположить:

- преобразовать в строковый тип библиотечными функциями и сохранить побайтно.

- сделать ассемблерную вставку, а там все сделать.

 

Хотелось бы выслушить ваши предложения,

по возможности реализацию.

Заранее благодарен за любые старания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я понял нужно получить доступ к каждому байту вещественного числа.

 

Я делаю так

 

float x;

*((BYTE*)(&x)) - первый байт

*((BYTE*)(&x)+1) - второй байт

*((BYTE*)(&x)+2) - третий байт

*((BYTE*)(&x)+3) - четвертый байт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>Наложи байтовый массив через union.

В принципе можно обьеденить одинакового размера две переменные, например

typedef union

{ float f_32; // 32bit

unsigned int i_32; // 32bit

} foo_t;

 

Будет же что и массив

float x;

*((BYTE*)(&x)) - первый байт

*((BYTE*)(&x)+1) - второй байт

*((BYTE*)(&x)+2) - третий байт

*((BYTE*)(&x)+3) - четвертый байт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зачем на int ?

union
{
float f;
struct
{
  char b0;
  char b1;
  char b2;
  char b3;
};
}
f = 3.14145926;
printf ("%d %d %d %d", b0, b1, b2, b3);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>зачем на int ?

Если int 32 бита(4 байта), например компилятор IAR, RealView, то

такое:

union {

float f;

struct {

char b0;

char b1;

char b2;

char b3;

};

}

 

И такеое:

typedef union {

float f;

unsigned int b;

} foo_t;

 

будут равнозначны.

С массивом функциональнее читается.

 

Уже работает на AT45 во всю.

Изменено пользователем Hastja

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С массивом функциональнее читается.
Тогда возьмите такую реализацию:

union 
{
    float f;
    uint8_t char b[sizeof(f)];
};
или 
union 
{
    float f;
    uint8_t char b[];
};
printf ("%d %d %d %d", b[0], b[1], b[2], b[3]);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Натяни" на это число байтовый массив через union. Хошь потом по байтам обращайся к переменной, а хочешь к переменной в целом, так будет читабельнее и приятней) ИМХО

Коллеги уже примеры написали, повторяться не буду))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...