2009-02-25 2 views
7

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

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

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

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

+1

Правильный способ использования битовых полей - не использовать битовые поля. –

ответ

17

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

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

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

+0

Спасибо за ваш вклад, но зачем добавлять структуру внутри объединения? Я сделал объединение частей float с поплавком, чтобы убедиться, что каждое битовое поле соответствует соответствующей части поплавка. Разве этого недостаточно? –

+1

союз сделает ВСЕ его члены разделят одну и ту же память. Я не думаю, что использование битовых полей изменит это поведение, так что все ваши битовые поля начинаются с бит 0, как это делает «all» float. Помещение их в структуру делает выложенное последовательно. – rmeador

+0

Вы были абсолютно правы! Вот что нужно. Тогда я обвиняю свое понимание союза :). Спасибо, друг, теперь я могу получить доступ к любой части моего поплавка по своему усмотрению. –

0

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

0

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

Смежные вопросы