Переинтерпретировать байты как плавающие в 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 проблемы:

  1. Buff = *(float*)&aux; пытается использовать адрес массива 4 int как указатель на число с плавающей точкой. aux[] возможно, имеет длину 16 байт и двоичный файл IEEE 754 с одинарной точностью float ожидается 4 байта.

  2. Оба каста: (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
Другие вопросы по тегам