Как правильно использовать битовые поля в C? - PullRequest
7 голосов
/ 25 февраля 2009

Я использую битовые поля для легкого доступа к библиотеке с плавающей точкой, которую я пытаюсь создать для микроконтроллера без 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 бит и затем последний бит. Если я не совсем неправильно понял использование битовых полей. Я думал, что использование упаковано решит проблему, но, как вы можете видеть, это не так.

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

Ответы [ 3 ]

17 голосов
/ 25 февраля 2009

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

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

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

0 голосов
/ 26 февраля 2009

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

0 голосов
/ 25 февраля 2009

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

...