2009-10-22 20 views

Respuesta

46

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 de char reglas de anchura y 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.

utiliza típicamente en C para acceder a valores de "comprimidos", tales como un nybble 4 bits que podría estar contenida en la mitad superior de un carbón de leña de 8 bits:

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

los abogados de idioma entre nosotros Para, la sección 9.6 de la norma C++ 11 explica esto en detalle, ligeramente parafraseó:


campos de bits [class.bit]

Un miembro-declarador de la forma

          identificador opt       atributo-especificador opt      :       constante-expresión

especifica un campo de bits; su longitud se establece a partir del nombre del campo de bits por dos puntos. El atributo-opcional-especificador pertenece a la entidad que se declara. El atributo de campo de bit no es parte del tipo del miembro de la clase.

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 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: campos de bits unidades de asignación a horcajadas 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

+1

Estrictamente hablando, en C puro no se usarían con 'unsigned char'. C solo permite 'int',' signed int' y 'unsigned int' en declaraciones de bitfield. C99 agrega '_Bool'. 'unsigned char' no es un tipo legal para bitfield en C. – AnT

+0

Ese es un problema de implementación, al menos en c1x: 6.7.2.1 para4 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 *. – paxdiablo

+1

@paxdiablo: Sí, pero el bit "algún otro tipo definido por la implementación" es realmente redundante, ya que la implementación siempre permite extender el idioma de la forma que considere conveniente, sin un permiso explícito en la sección específica del estándar. Una implementación C puede compilar el código Pascal y Fortran dentro del código C; nadie le prohíbe hacerlo. Sin embargo, sería extraño comentar el código Fortran como código C posiblemente válido por esa razón. Lo mismo se aplica a ese "tipo definido por la implementación" también. – AnT

7

Creo que esos serían bitfields.

+0

¿Por qué el voto a favor? –

+7

No estoy seguro, a menos que sea la brevedad o la incertidumbre, pero aquí hay un voto positivo ya que (1) eres técnicamente correcto; y (2) compartir el amor alrededor :-) – paxdiablo

0

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 tendrá un tipo que es una versión calificado o no calificado de _Bool, firmó int, unsigned int, o algún otro tipo de 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 gran suficiente para mantener 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 empacará si es posible.

Ref C11 6.7.2.1:

Si de espacio suficiente, un campo de bits que sigue inmediatamente a otro campo de bits en una estructura se envasará en 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 superpone a las unidades adyacentes está definido por la implementación.

Cuestiones relacionadas