Respuesta impredecible en campo de bits

¿Podría explicarme por qué la salida de este código es 12 (1100b)?

¿Y cómo es el sizeof (bit1) 4byte?

#include  #include  struct bitfield { unsigned a:5; unsigned c:5; unsigned b:6; }; void main() { char *p; struct bitfield bit1={1,3,3}; //a=00001 ,c=00011 ,b=000011 p=&bit1; // p get the address of bit1 p++; // incriment the address of p in 1 printf("%d\n",*p); printf("%d\n",sizeof(bit1)); } 

Has declarado tus campos de bits como unsigned . En la mayoría de los sistemas modernos, es un entero de 32 bits. (el corto sin firmar es 16, char 8, long 64, etc.) Por lo tanto, está declarando un contenedor de campo de bits de 32 bits. El tamaño de cada argumento de campo de bit individual viene dado por el entero después del nombre del campo de bit, pero el tamaño del contenedor en el que están empaquetados es un múltiplo del tipo de datos especificado … por lo general, el múltiplo más pequeño que el número total de bits indicado encaja, aunque los límites de las palabras y otras cosas jugarán en eso.

Estoy sorprendido de que todo el rest funcione. Aparte de los problemas de conversión en el puntero, el printf está imprimiendo los primeros 8 bits de todo el campo … un solo carácter. Eso no se interrumpirá en los campos de bits en sí, sino en el límite de la memoria byte / char. Dependiendo de si su sistema es big endian o little endian, será el MSB o el LSB de todo el campo.

El puntero p contiene la dirección de la variable de estructura bit1 .

Creo que su sistema tiene un pequeño direccionamiento endian debido a que la variable b se coloca en la ubicación apuntada por el puntero p y * p imprime el contenido de los dos primeros bytes de bit1 .

En su caso b=3 (000011)

Pero los dos bytes contienen,

 00000000 00001100 (12) ------ ^ | Value of b 

Para entender mejor esto,

cambie el valor de b a 5 (000101) de la siguiente manera,

 struct bitfield bit1={1,1,5}; 

Entonces tu salida será de 20 porque

 00000000 00010100 (20) ------ ^ | Value of b 

El bitfield estructura empaqueta a , c y b en un solo entero sin signo. El tamaño del entero sin signo es de 4 bytes .