Perdón por el título no descriptivo, no estaba seguro de cómo plantear esto en una línea.
Tengo una estructura de datos, donde tengo dos valores: uno de 14 bits, uno de 10 bits. Quiero poder acceder a ellos como bytes en una unión. tengo lo siguiente:
struct test { union { struct { unsigned int a : 14; unsigned int b : 10; } fields; struct { unsigned char i0; unsigned char i1; unsigned char i2; } bytes; } id; }; Ahora, cuando asigno 1 al valor en bytes.i2 , esperaría que el valor en values.b también asuma el valor 1. Pero el valor en values.b es en realidad bytes.i2 desplazado a la izquierda por 2 bits.
int main() { struct test x; x.id.bytes.i2 = 1; printf("%d", x.id.fields.b); // OUTPUTS 4 return 0; }Debo estar perdiendo algún principio básico aquí, ¡cualquier idea sería útil!
En little endian, estructuras empaquetadas:
fields a |b bytes i0 |i1 : |i2 BITS 00000000|000000|00|10000000 i2 = 1; b = 4 BITS 00000000|000000|10|10000000 i1 = 64; b = 1 INDEX 01234567|890123|45|67890123 0 1 2Como puedes ver b = 0b00000100 (4)
El diseño y el orden exactos de los campos de bits en una estructura dependen completamente de la implementación.
En una máquina little endian, el diseño de la unión probablemente se vea así:
|a |ba |b | |7 6 5 4 3 2 1 0|1 0 dcba 9 8|a 9 8 7 6 5 4 3| | i0 | i1 | i2 | ------------------------------------------------- | | | | | | | | | | | | | | | | | | | | | | | | | ------------------------------------------------- En este diseño, podemos ver que los 8 bits de orden bajo de a están en el primer byte, luego los 6 bits de orden alto de a y los 2 bits de orden bajo de b en el segundo byte, seguidos por los 8 bits de orden alto de b en el tercer byte. Esto explica el resultado que estás viendo.
La máquina Little Endian normalmente también tendrá los bits en formato Little Endian, por lo que si invierte el orden de los bits en cada byte anterior, reflejando la representación física en lugar de la representación lógica, puede ver que los bits de cada campo de bits son contiguos.