Переинтерпретировать байты как плавающие в C (двоичный файл с одинарной точностью IEEE 754)
Я хочу переосмыслить 4 байта как двоичный файл IEEE 754 с одинарной точностью в C.
Чтобы получить байты, которые представляют float
, Я использовал:
num = *(uint32_t*)&MyFloatNumber;
aux[0] = num & 0xFF;
aux[1] = (num >> 8) & 0xFF;
aux[2] = (num >> 16) & 0xFF;
aux[3] = (num >> 24) & 0xFF;
- num это uint32_t.
- aux [] - это int[4].
Переосмыслить байты как float
, Я пытаюсь:
Buff = *(float*)&aux;
Во втором случае ничего не предвещает "Buff"
- Бафф это
float
,
Что я делаю не так во втором случае?
1 ответ
2 проблемы:
Buff = *(float*)&aux;
пытается использовать адрес массива 4int
как указатель на число с плавающей точкой.aux[]
возможно, имеет длину 16 байт и двоичный файл IEEE 754 с одинарной точностьюfloat
ожидается 4 байта.Оба каста:
(uint32_t*)
а также(float*)
вызвать неопределенное поведение, а также проблемы выравнивания и сглаживания. Лучше использоватьunion
,int main(void) { union { float f; unsigned char uc[sizeof(float)]; } x; // float to bytes x.f = 1.23f; printf("%x %x %x %x\n", x.uc[0], x.uc[1], x.uc[2], x.uc[3]); // bytes to float x.uc[0] = 0xA4; x.uc[1] = 0x70; x.uc[2] = 0x9D; x.uc[3] = 0x3F; printf("%.8e\n", x.f); }
Выход
a4 70 9d 3f
1.23000002e+00