2010-07-22 19 views
22

posibles duplicados:
What does ‘: number’ after a struct field mean?
What does ‘unsigned temp:3’ meansUso del: operador en C

Hola a todos, odio a pedir este tipo de pregunta, pero en realidad me molesta, por lo Preguntaré:

¿Cuál es la función del operador: en el siguiente código?

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

Si a alguien le interesa en absoluto, me sacó el código desde el siguiente enlace: http://www.cplusplus.com/forum/beginner/15843/

Realmente me gustaría saber porque sé que he visto antes en alguna parte, y yo quiero entenderlo para cuando lo vea de nuevo

Gracias!

+0

Tenga en cuenta que el diseño de campos de bits es definida por la implementación, por lo que el resultado de acceder a los campos de bits en un int a través de una unión no está definido. No haga esto en el código de producción, use máscaras de bits y cambie en su lugar. – starblue

Respuesta

38

Son campos de bits, un ejemplo es que unsigned int addr:9; crea un campo addr de 9 bits de longitud.

Se usa comúnmente para empacar muchos valores en un tipo integral. En su caso particular, define la estructura de una instrucción de microcódigo de 32 bits para una CPU (posiblemente) hipotética (si suma todas las longitudes de campo de bit, suman a 32).

La unión le permite cargar en un solo valor de 32 bits y luego acceder a los campos individuales con código como (problemas de menor importancia fijos, así, específicamente las declaraciones de code y 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; 
} 

Este imprime 7, que son los tres bits que componen el campo de bits alu.

7

Es un bit field. El número después de los dos puntos es cuántos bits ocupa cada variable.