2009-02-25 28 views
7

Używam bitfields, aby uzyskać łatwy dostęp do biblioteki float, którą próbuję wykonać dla mikrokontrolera bez FPU.Jaki jest poprawny sposób korzystania z bitfields w C?

Problem polega na tym, że nie mogę sprawić, by działał z bitfieldami. Spójrz:

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

     }; 

}_float __attribute__((__packed__)); 

Problem polega na tym, że przy próbie dostępu lub zmienić cokolwiek to uważa bitfields jak 1,8,23 bitów od końca odpowiednio. Chociaż powinno to być 23 bity od końca, a następnie 8 bitów, a następnie ostatni bit. Chyba że zupełnie źle zrozumiałem użycie bitfieldów. Pomyślałem, że użycie zapakowane rozwiąże problem, ale jak widać, nie.

Każda pomoc będzie naprawdę doceniana. Byłem prowadzony na tej stronie podczas googling więcej niż raz, więc mam duże nadzieje.

+1

Poprawnym sposobem korzystania z bitfieldów jest niestosowanie bitfieldów. –

Odpowiedz

17

Być może brakuje ci struktury wewnątrz twojego związku.

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

Zauważ, że kolejność mantysy/wykładnik i znak zależy ONE kolejność bajtów CPU.

+0

Dziękuję za Twój wkład, ale dlaczego dodasz strukturę do związku? Wykonałem połączenie części pływaka z pływakiem, aby upewnić się, że każde pole bitowe odpowiada odpowiedniej części pływaka. Czy to nie wystarczy? –

+1

związek sprawi, że WSZYSCY jego członkowie będą dzielić to samo wspomnienie. Nie sądzę, że użycie bitfieldów zmieni to zachowanie, więc wszystkie twoje bitfieldy zaczynają się od bitu 0, tak jak robi to "all" float. Umieszczenie ich w strukturze sprawia, że ​​układane są sekwencyjnie. – rmeador

+0

Masz absolutną rację! To było potrzebne. Winiam wtedy moje zrozumienie związku :). Dziękuję przyjacielu, teraz jestem w stanie uzyskać dostęp do dowolnej części mojego float do woli. –

0

Problem polega na tym, że jest to związek. Powinien być "strukturalny".

0

Jeśli jesteś na platformie glibc, możesz rzucić okiem na plik nagłówkowy ieee754.h. Dba o rzeczy bez końca. Jeśli nie, to prawdopodobnie warto na niego spojrzeć.

Powiązane problemy