2010-10-19 7 views

Respuesta

5

campos Char bits funcionan de la misma manera como int, sólo el tipo de base es de 8 bits de ancho, y no de 32 bits. Entonces obtendrías una struct stats, que tiene el tamaño de 1 byte, y 3 variables miembro, ocupando un total de 4 bits.

+0

bien, veo gracias. –

+1

@Tommy: en realidad se debe tener cuidado con 'char' aquí porque esto no es portátil y tienen la ambigüedad de que puedan ser firmados o no firmados tipos. Si puede, evite esto y use 'unsigned' o' _Bool'. Dos bits de una 'necesidad unsigned' exactamente el mismo espacio que dos bits de un' char' ;-) –

+1

Por no hablar de que debe evitar campos de bits para empezar. –

2

simplemente define el tamaño de la variable que usará.

char 
int 

Este no es compatible con el estándar (uso típico es unsigned int), pero es un buen intento :)

re: la consulta, se trata de un intento por parte del ejecutor de usar menos memoria para su campos de bits (char en lugar de unsigned int)

Además, desde Atmel, obtenemos:

en la Norma C, sólo “sin firmar (int) "e" int "son tipos de datos aceptables para un miembro de campo de bits. Algunos compiladores permiten “unsigned char” ........

+0

¿Cuáles son los valores posibles para un char de 1 bit? –

+1

no es un char de un bit, es un bit dentro de un char – KevinDTimm

+2

char tiene un byte de tamaño, por lo que toma valores -128 a 127 (firmado) o 0 a 255 (sin signo). Si quiere usarlo como un campo de bit, necesita usar máscaras y operadores bit a bit | &^~ << and >> – Tristan

5

Los campos de bits deben declararse con el tipo signed int, unsigned int, o bool desde <stdbool.h>. Otros tipos pueden ser legales o no (dependiendo de la plataforma), pero tenga cuidado con la firma: se puede considerar que el int es sin signo para un campo de bits.

Dicho esto, puede ser una pista para el compilador de que la alineación de struct debe ser 1 y no sizeof(int). Y el compilador puede aceptar char y asignarle ese significado.

Según C99 6.7.2.1/9,

Un campo de bits se interpreta como un tipo entero con o sin signo que consiste en el número especificado de bits. Si el valor 0 o 1 se almacena en un campo de bits de ancho distinto de cero de tipo _Bool, el valor del campo de bits se comparará con el valor almacenado.

y un pie de página:

Como se especifica en 6.7.2 anterior, si el especificador de tipo real utilizado es int o un nombre typedef definido como int, entonces es definido por la implantación si el bit -field está firmado o sin firmar.

+3

C99 dice explícitamente en 6.7.2.1/4 "_Bool, int firmado, unsigned int, o algún otro tipo definido por la implementación". Es de suponer que la implementación es libre de definir si el objeto contenedor de campo de bits es realmente tan pequeño como un único 'char', como parece podría ser en este caso. – RBerteig

+1

@RBerteig: ¿Dije algo para contradecir eso? – Potatoswatter

+1

Lo siento, aparentemente he leído "Otros tipos pueden ser o no legales ..." como si realmente no dijera "implementación definida". (Mi única excusa es la inmersión en el standardese con insuficiente cafeína). No puedo encontrar ninguna respuesta clara del estándar acerca de lo que 'sizeof()' debería decir en este caso, sin embargo. – RBerteig

Cuestiones relacionadas