2010-06-01 12 views
52

Mögliche Duplizieren:
What does this C++ code mean?Was bedeutet 'unsigned temp: 3' in einer Struktur oder einer Union?

Ich versuche, eine C-Struktur mit Hilfe von Java JNA abzubilden. Ich bin auf etwas gestoßen, das ich noch nie gesehen habe.

Die struct Definition lautet wie folgt:

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; 
}; 

Sie einige Variablen wie unsigned op_attached:1 definiert zu sehen sind, und ich bin nicht sicher, was würde das bedeuten. Würde das die Anzahl der für diese bestimmte Variable zuzuweisenden Bytes beeinflussen?

+1

Wow, das ist auch völlig neu für mich. Schöner Fund! –

+4

'Doppelpunkt' hinzugefügt, um beim Suchen zu helfen. –

+0

Das Beste, was Sie mit Bitfeldern tun können, ist, sie zu vermeiden. Bessere Verwendung von masking & shifting, um Gruppen von Bits in ganzen Zahlen in einer klar definierten Weise zu erreichen. – starblue

Antwort

39

Dieses Konstrukt gibt die Länge in Bits für jedes Feld an.

Der Vorteil davon ist, dass Sie die sizeof(op) steuern können, wenn Sie vorsichtig sind. Die Größe der Struktur ist die Summe der Größen der Felder im Inneren.

In Ihrem Fall ist die Größe von op 32 Bit (dh sizeof(op) ist 4).

Die Größe wird immer auf das nächste Vielfache von 8 für jede Gruppe von unsignierten xxx aufgerundet: yy; bauen.

Das bedeutet:

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) 

Ich bin mir nicht sicher, ob ich das richtig erinnere, aber ich denke, ich es richtig verstanden habe.

+11

Denken Sie an Kinder! Bitfelder sind Compiler-abhängig, es gibt keinen C/C++ - Standard, der spezifiziert, dass die ersten 4 Bits auf dem obigen a: 4 verwendet werden müssen. –

+1

Angenommen, 8 Bits pro Byte. – Ferruccio

+1

Angenommen, 8 Bits pro Byte sind sicher. Angenommen, der Compiler verwendet keine Füllbits oder hat eine bestimmte Byte-Reihenfolge, ist dies jedoch nicht. – starturtle

19

Es erklärt eine bit field; die Zahl nach dem Doppelpunkt gibt die Länge des Feldes in Bits an (d. h. wie viele Bits verwendet werden, um es darzustellen).

4

Der Modifikator "Colon" für Integraltypen gibt an, wie viele Bits der Int aufnehmen soll.

6
unsigned op_type:9; 

Bedeutet op_type ist eine Ganzzahlvariable mit 9 Bits.