Uso del operador : en C [duplicate]

2 minutos de lectura

avatar de usuario
russel

Posibles duplicados:

¿Qué significa ‘: número’ después de un campo de estructura?
¿Qué significa ‘temp sin firmar: 3’?

Odio hacer este tipo de preguntas, pero realmente me está molestando, así que 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 importa, saqué este código del siguiente enlace:
http://www.cplusplus.com/forum/beginner/15843/

Realmente me gustaría saber porque sé que he visto esto antes en alguna parte, y quiero entenderlo para cuando lo vuelva a ver.

  • Tenga en cuenta que el diseño de los campos de bits está definido 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 desplazamiento en su lugar.

    – estrella azul

    22 de julio de 2010 a las 5:50

avatar de usuario
paxdiablo

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

Se usa comúnmente para empaquetar 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 (posiblemente) CPU hipotética (si suma todas las longitudes de campo de bits, suman 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 menores solucionados también, 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;
}

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

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

Ese es un declarador que especifica el número de bits para la variable.

Para más información, ver:

http://msdn.microsoft.com/en-us/library/yszfawxh(VS.80).aspx

  • el enlace esta roto

    – DavidS

    17/09/2018 a las 12:20

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad