Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

256
Views
¿Por qué obtengo esta salida de una unión C con campos de bits en mi código?

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!

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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 2

Como puedes ver b = 0b00000100 (4)

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!