2010-06-01 11 views
52

Eventuali duplicati:
What does this C++ code mean?Cosa significa "unsigned temp: 3" in una struct o in union?

Sto cercando di mappare una struttura C a Java utilizzando JNA. Mi sono imbattuto in qualcosa che non avevo mai visto.

Il struct definizione è la seguente:

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

si possono vedere alcune variabile in fase di definizione, come unsigned op_attached:1 e io sono sicuro di cosa vorrebbe dire. Avrebbe questo effetto il numero di byte da allocare per questa particolare variabile?

+1

Wow, questo è completamente nuovo anche per me. Bella scoperta! –

+4

Aggiunto "due punti" per aiutarlo a cercare. –

+0

La cosa migliore che puoi fare con i campi bit è di evitarli. Meglio usare il mascheramento e lo spostamento per accedere a gruppi di bit in numeri interi in un modo ben definito. – starblue

risposta

39

Questo costrutto specifica la lunghezza in bit per ogni campo.

Il vantaggio di questo è che è possibile controllare lo sizeof(op), se si presta attenzione. la dimensione della struttura sarà la somma delle dimensioni dei campi all'interno.

Nel tuo caso, la dimensione dell'opzione è 32 bit (ovvero, sizeof(op) è 4).

La dimensione viene sempre arrotondata al successivo multiplo di 8 per ogni gruppo di xxx senza segno: aa; costruire.

Ciò significa:

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) 

Non sono sicuro mi ricordo correttamente, ma penso che ho capito bene.

+11

Ricorda i bambini! i campi di bit dipendono dal compilatore, non esiste uno standard C/C++ che specifichi che i primi 4 bit devono essere usati su a: 4 sopra. –

+1

Assumendo 8 bit per byte. – Ferruccio

+1

Supponendo che 8 bit per byte siano sicuri. Supponendo che il compilatore non utilizzi i bit di riempimento o abbia un ordine di byte specifico, tuttavia, non lo è. – starturtle

19

Dichiara un bit field; il numero dopo i due punti indica la lunghezza del campo in bit (cioè, quanti bit vengono usati per rappresentarlo).

4

Il modificatore di due punti sui tipi interi specifica quanti bit deve occupare l'int.

6
unsigned op_type:9; 

Mezzi op_type è una variabile intera con 9 bit.