Как правильно использовать битовые поля в C?

Я использую битовые поля, чтобы получить легкий доступ к библиотеке с плавающей запятой, которую я пытаюсь сделать для микроконтроллера без FPU.

Проблема в том, что я не могу заставить его работать с битовыми полями. Взглянем:

typedef struct
{
   union{
    unsigned long mantissa: 23;
    unsigned long exponent: 8;
    unsigned long sign: 1;
    float all;

      };

}_float __attribute__((__packed__));

Проблема в том, что когда я пытаюсь получить доступ или изменить что-либо, он считает битовые поля равными 1,8,23 бита от конца соответственно. Хотя это должно быть 23 бита с конца, затем 8 бит и затем последний бит. Если только я полностью не понял использование битовых полей. Я думал, что использование pack решит проблему, но, как видите, этого не произошло.

Любая помощь могла бы быть полезна. Я неоднократно попадал на этот сайт, когда гуглил, поэтому я возлагаю большие надежды.

Ответов (3)

Решение

Возможно, вам не хватает структуры внутри вашего союза.

typedef struct
{
    union{
       struct {
           unsigned long mantissa: 23;
           unsigned long exponent: 8;
           unsigned long sign: 1;
       } float_parts;
       float all;
    };
}_float __attribute__((__packed__));

Обратите внимание, что порядок мантиссы / экспоненты и знака зависит от порядка байтов процессора.

Если вы работаете на платформе glibc, вы можете взглянуть на заголовочный файл ieee754.h. Он заботится о порядке байтов. Если нет, возможно, стоит взглянуть на него.

Проблема в том, что это союз. Это должно быть «структура».