¿Qué significa un signo de dos puntos en una estructura, como: 1,: 7,: 16 o: 32?

StackOverflow https://stackoverflow.com/questions/1604968

  •  05-07-2019
  •  | 
  •  

Pregunta

¿Qué significa el siguiente código C ++?

unsigned char a : 1; 
unsigned char b : 7;

Supongo que crea dos caracteres a y b, y ambos deberían tener un byte de largo, pero no tengo idea de cuál es el '': 1 '' y '': 7 '' parte hace.

¿Fue útil?

Solución

El 1 y el 7 son tamaños de bits para limitar el rango de los valores. Se encuentran típicamente en estructuras y sindicatos. Por ejemplo, en algunos sistemas (depende del ancho de char y las reglas de empaque, etc.), el código:

typedef struct {
    unsigned char a : 1;
    unsigned char b : 7;
} tOneAndSevenBits;

crea un valor de 8 bits, un bit para a y 7 bits para b .

Normalmente se usa en C para acceder a "comprimido" valores como un nybble de 4 bits que puede estar contenido en la mitad superior de un carácter de 8 bits:

typedef struct {
    unsigned char leftFour  : 4;
    unsigned char rightFour : 4;
} tTwoNybbles;

Para los abogados de idiomas entre nosotros, la sección 9.6 del estándar C ++ 11 explica esto en detalle, un poco parafraseado:


Campos de bits [class.bit]

Un miembro declarador del formulario

     identifieropt   attribute-specifieropt & nbsp; & nbsp; & nbsp;: & nbsp; & nbsp; & nbsp; expresión constante

especifica un campo de bits; su longitud está separada del nombre del campo de bits por dos puntos. El atributo-especificador opcional corresponde a la entidad que se declara. El atributo de campo de bits no forma parte del tipo de miembro de la clase.

La expresión constante será una expresión constante integral con un valor mayor o igual a cero. El valor de la expresión constante integral puede ser mayor que el número de bits en la representación del objeto del tipo de campo de bits; en tales casos, los bits adicionales se usan como bits de relleno y no participan en la representación del valor del campo de bits.

La asignación de campos de bits dentro de un objeto de clase está definida por la implementación. La alineación de los campos de bits está definida por la implementación. Los campos de bits se empaquetan en alguna unidad de asignación direccionable.

Nota: unidades de asignación de straddle de campos de bits en algunas máquinas y no en otras. Los campos de bits se asignan de derecha a izquierda en algunas máquinas, de izquierda a derecha en otras. - nota final

Otros consejos

Creo que esos serían campos de bits.

Estrictamente hablando, un campo de bits debe ser int, unsigned int o _Bool. Aunque la mayoría de los compiladores tomarán cualquier tipo integral.

Ref. C11 6.7.2.1:

  

Un campo de bits debe tener un tipo calificado o no calificado   versión de _Bool, firmado int, unsigned int u otro   tipo definido por la implementación.

Su compilador probablemente asignará 1 byte de almacenamiento, pero es libre de obtener más.

Ref. C11 6.7.2.1:

  

Una implementación puede asignar cualquier unidad de almacenamiento direccionable grande   suficiente para contener un campo de bits.

El ahorro se produce cuando tiene varios campos de bits que se declaran uno tras otro. En este caso, el almacenamiento asignado se empaquetará si es posible.

Ref. C11 6.7.2.1:

  

Si queda suficiente espacio, un campo de bits que   sigue inmediatamente a otro campo de bits en una estructura que se empacará   en bits adyacentes de la misma unidad. Si queda poco espacio,   si un campo de bits que no encaja se coloca en la siguiente unidad o   solapa las unidades adyacentes está definida por la implementación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top