2010-06-01 11 views
52

Powiel możliwe:
What does this C++ code mean?Co oznacza "nie podpisany temp: 3" w strukturze lub zrostu?

staram się odwzorować strukturę C do Java przy użyciu JNA. Natknąłem się na coś, czego nigdy nie widziałem.

Definicja struct jest następujący:

struct op 
{ 
    unsigned op_type:9; //---> what does this mean? 
    unsigned op_opt:1; 
    unsigned op_latefree:1; 
    unsigned op_latefreed:1; 
    unsigned op_attached:1; 
    unsigned op_spare:3; 
    U8 op_flags; 
    U8 op_private; 
}; 

można zobaczyć niektóre zmienna jest zdefiniowana jak unsigned op_attached:1 i jestem pewien, co by to oznaczało. Czy w takim przypadku liczba bajtów zostanie przydzielona dla tej konkretnej zmiennej?

+1

Wow, to także zupełnie nowe dla mnie. Ładne znalezisko! –

+4

Dodano "dwukropek", aby ułatwić wyszukiwanie. –

+0

Najlepszą rzeczą, którą można zrobić za pomocą pól bitowych, jest ich unikanie. Lepiej użyj maskowania i przesuwania, aby uzyskać dostęp do grup bitów w liczbach całkowitych w dobrze określony sposób. – starblue

Odpowiedz

39

Ta konstrukcja określa długość w bitach dla każdego pola.

Zaletą tego jest to, że możesz kontrolować sizeof(op), jeśli jesteś ostrożny. wielkość struktury będzie sumą rozmiarów pól wewnątrz.

W twoim przypadku rozmiar op wynosi 32 bity (czyli sizeof(op) to 4).

Wielkość zawsze zostanie zaokrąglona do następnej wielokrotności 8 dla każdej grupy niepodpisanych xxx: yy; zbudować.

To znaczy:

struct A 
{ 
    unsigned a: 4; // 4 bits 
    unsigned b: 4; // +4 bits, same group, (4+4 is rounded to 8 bits) 
    unsigned char c; // +8 bits 
}; 
//     sizeof(A) = 2 (16 bits) 

struct B 
{ 
    unsigned a: 4; // 4 bits 
    unsigned b: 1; // +1 bit, same group, (4+1 is rounded to 8 bits) 
    unsigned char c; // +8 bits 
    unsigned d: 7; // + 7 bits 
}; 
//     sizeof(B) = 3 (4+1 rounded to 8 + 8 + 7 = 23, rounded to 24) 

Nie jestem pewien, pamiętam to poprawnie, ale myślę, że miał rację.

+11

Pamiętaj dzieci! pola bitowe są zależne od kompilatora, nie ma standardu C/C++, który określa, że ​​pierwsze 4 bity muszą być użyte na a: 4 powyżej. –

+1

Zakładając 8 bitów na bajt. – Ferruccio

+1

Założenie, że 8 bitów na bajt jest bezpieczne. Założenie, że kompilator nie użyje bitów dopełniających lub ma jedną określoną kolejność bajtów, jednak nie jest. – starturtle

19

Deklaruje numer bit field; liczba po dwukropku podaje długość pola w bitach (tj. ile bitów jest używanych do jego reprezentacji).

4

Modyfikator dwukropka na typach całkowitych określa liczbę bitów, które powinna zająć int.

6
unsigned op_type:9; 

Środki op_type jest zmienną całkowitą z 9 bitami.