2010-07-22 16 views
22

Possibili duplicati:
What does ‘: number’ after a struct field mean?
What does ‘unsigned temp:3’ meansuso del: operatore in C

Ciao a tutti, mi dispiace chiedere questo tipo di domanda, ma è davvero bugging me, così Chiederò:

Qual è la funzione di: operatore nel codice qui sotto?

#include <stdio.h> 

struct microFields 
{ 
    unsigned int addr:9; 
    unsigned int cond:2; 
    unsigned int wr:1; 
    unsigned int rd:1; 
    unsigned int mar:1; 
    unsigned int alu:3; 
    unsigned int b:5; 
    unsigned int a:5; 
    unsigned int c:5; 
}; 

union micro 
{ 
    unsigned int microCode; 
    microFields code; 
}; 

int main(int argc, char* argv[]) 
{ 
    micro test; 
    return 0; 
} 

se qualcuno avesse voglia a tutti, ho tirato questo codice dal link sottostante: http://www.cplusplus.com/forum/beginner/15843/

mi piacerebbe davvero sapere perché so che ho visto prima da qualche parte, e voglio capire per quando lo vedo di nuovo.

Grazie!

+0

Nota che il layout di campi di bit è implementazione definita, in modo che il risultato di accesso ai campi di bit in un int attraverso un'unione non è definito. Non farlo nel codice di produzione, usa invece le maschere di bit e lo spostamento. – starblue

risposta

38

Sono campi bit, un esempio è che unsigned int addr:9; crea un campo addr lungo 9 bit.

È comunemente utilizzato per impacchettare molti valori in un tipo integrale. Nel vostro caso particolare, definisce la struttura di un'istruzione di microcodice a 32 bit per una (possibilmente) ipotetica CPU (se sommate tutte le lunghezze dei campi di bit, esse sommano a 32).

L'unione consente di caricare in un singolo valore a 32 bit e quindi accedere i singoli campi con codice come (problemi minori fisso nonché, in particolare le dichiarazioni di code e test):

#include <stdio.h> 

struct microFields { 
    unsigned int addr:9; 
    unsigned int cond:2; 
    unsigned int wr:1; 
    unsigned int rd:1; 
    unsigned int mar:1; 
    unsigned int alu:3; 
    unsigned int b:5; 
    unsigned int a:5; 
    unsigned int c:5; 
}; 

union micro { 
    unsigned int microCode; 
    struct microFields code; 
}; 

int main (void) { 
    int myAlu; 
    union micro test; 
    test.microCode = 0x0001c000; 
    myAlu = test.code.alu; 
    printf("%d\n",myAlu); 
    return 0; 
} 

Questo stampa 7, ovvero i tre bit che compongono il campo di bit alu.

7

È un bit field. Il numero dopo i due punti indica quanti bit ogni variabile occupa.