c++ - una - funciones con estructuras en c
¿Qué significa dos puntos en una declaración struct, como: 1,: 7,: 16 o: 32? (3)
¿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 deben tener un byte de longitud, pero no tengo idea de qué hace la parte ": 1" y ": 7".
Creo que esos serían bitfields.
El 1 y el 7 son tamaños de bits para limitar el rango de los valores. Por lo general, se encuentran en estructuras y uniones. Por ejemplo, en algunos sistemas (depende del ancho del char
y las reglas de embalaje, 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 valores "comprimidos" como un nybble de 4 bits que podría estar contenido en la mitad superior de un char 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, ligeramente parafraseado:
Campos de bits [class.bit]
Un miembro declarador del formulario
identificador opt atributo-especificador opt : constant-expression
especifica un campo de bit; su longitud se establece a partir del nombre del campo de bits por dos puntos. El atributo-especificador opcional pertenece a la entidad que se declara. El atributo de campo de bit no es parte del tipo del miembro de la clase.
La expresión constante debe 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 campo de bit; en tales casos, los bits adicionales se utilizan 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 una unidad de asignación direccionable.
Nota: los campos de bits montan unidades de asignación 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
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 que sea una versión calificada o no calificada de _Bool, firmado int, unsigned int, o algún otro tipo definido por la implementación.
Su compilador probablemente asignará 1 byte de almacenamiento, pero es gratis para obtener más.
Ref C11 6.7.2.1:
Una implementación puede asignar cualquier unidad de almacenamiento direccionable lo suficientemente grande como para contener un campo de bits.
El ahorro se produce cuando tienes varios campos de bits que se declaran uno tras otro. En este caso, el almacenamiento asignado se empacará 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 debe empaquetarse en los bits adyacentes de la misma unidad. Si queda espacio insuficiente, si un campo de bits que no encaja se coloca en la siguiente unidad o se solapa con las unidades adyacentes, se define la implementación.