![]() Esta es la disposición en memoria de una
struct
con tres campos: un
int
, un
float
y un
muchos_bits
formado por 32 bits.Cada campo ocupa una zona de memoria independiente . |
![]() Esta es la disposición en memoria de una
union
que está formada por los mismos campos que la
struct
que se muestra a la izquierda.Los campos están superpuestos en memoria . |
float
.#include<stdio.h> /* Este programa muestra la estructura de bits de un entero y de un real. */ struct muchos_bits { unsigned bit1:1; unsigned bit2:1; unsigned bit3:1; unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1; unsigned bit8:1; unsigned bit9:1; unsigned bit10:1; unsigned bit11:1; unsigned bit12:1; unsigned bit13:1; unsigned bit14:1; unsigned bit15:1; unsigned bit16:1; unsigned bit17:1; unsigned bit18:1; unsigned bit19:1; unsigned bit20:1; unsigned bit21:1; unsigned bit22:1; unsigned bit23:1; unsigned bit24:1; unsigned bit25:1; unsigned bit26:1; unsigned bit27:1; unsigned bit28:1; unsigned bit29:1; unsigned bit30:1; unsigned bit31:1; unsigned bit32:1; }; union Ejemplo_union { int entero_union; float float_union; struct muchos_bits bits_union; } union_prueba; int entero_prueba; float float_prueba; void main(void) { printf("Programa de prueba para uniones, enteros y reales.\n\n"); printf("Escriba el valor de un entero: "); scanf("%d", &entero_prueba); union_prueba.entero_union = entero_prueba; printf("\nLo que sigue es la estructura de bits del entero:\n\n"); /* printf("@primer bit: %ld\n",&(union_prueba.bits_union.bit1)); printf("@noveno bit: %ld\n",&(union_prueba.bits_union.bit9)); printf("@decimoseptimo bit: %ld\n",&(union_prueba.bits_union.bit17)); printf("@vigesimoquinto bit: %ld\n\n",&(union_prueba.bits_union.bit25)); */ printf("%d",union_prueba.bits_union.bit1); printf("%d",union_prueba.bits_union.bit2); printf("%d",union_prueba.bits_union.bit3); printf("%d",union_prueba.bits_union.bit4); printf("%d",union_prueba.bits_union.bit5); printf("%d",union_prueba.bits_union.bit6); printf("%d",union_prueba.bits_union.bit7); printf("%d",union_prueba.bits_union.bit8); printf("%d",union_prueba.bits_union.bit9); printf("%d",union_prueba.bits_union.bit10); printf("%d",union_prueba.bits_union.bit11); printf("%d",union_prueba.bits_union.bit12); printf("%d",union_prueba.bits_union.bit13); printf("%d",union_prueba.bits_union.bit14); printf("%d",union_prueba.bits_union.bit15); printf("%d",union_prueba.bits_union.bit16); printf("%d",union_prueba.bits_union.bit17); printf("%d",union_prueba.bits_union.bit18); printf("%d",union_prueba.bits_union.bit19); printf("%d",union_prueba.bits_union.bit20); printf("%d",union_prueba.bits_union.bit21); printf("%d",union_prueba.bits_union.bit22); printf("%d",union_prueba.bits_union.bit23); printf("%d",union_prueba.bits_union.bit24); printf("%d",union_prueba.bits_union.bit25); printf("%d",union_prueba.bits_union.bit26); printf("%d",union_prueba.bits_union.bit27); printf("%d",union_prueba.bits_union.bit28); printf("%d",union_prueba.bits_union.bit29); printf("%d",union_prueba.bits_union.bit30); printf("%d",union_prueba.bits_union.bit31); printf("%d",union_prueba.bits_union.bit32); printf("\n\nEscriba el valor de un float: "); scanf("%f", &float_prueba); union_prueba.float_union = float_prueba; printf("\nLo que sigue es la estructura de bits del float:\n\n"); printf("%d",union_prueba.bits_union.bit1); printf("%d",union_prueba.bits_union.bit2); printf("%d",union_prueba.bits_union.bit3); printf("%d",union_prueba.bits_union.bit4); printf("%d",union_prueba.bits_union.bit5); printf("%d",union_prueba.bits_union.bit6); printf("%d",union_prueba.bits_union.bit7); printf("%d",union_prueba.bits_union.bit8); printf("%d",union_prueba.bits_union.bit9); printf("%d",union_prueba.bits_union.bit10); printf("%d",union_prueba.bits_union.bit11); printf("%d",union_prueba.bits_union.bit12); printf("%d",union_prueba.bits_union.bit13); printf("%d",union_prueba.bits_union.bit14); printf("%d",union_prueba.bits_union.bit15); printf("%d",union_prueba.bits_union.bit16); printf("%d",union_prueba.bits_union.bit17); printf("%d",union_prueba.bits_union.bit18); printf("%d",union_prueba.bits_union.bit19); printf("%d",union_prueba.bits_union.bit20); printf("%d",union_prueba.bits_union.bit21); printf("%d",union_prueba.bits_union.bit22); printf("%d",union_prueba.bits_union.bit23); printf("%d",union_prueba.bits_union.bit24); printf("%d",union_prueba.bits_union.bit25); printf("%d",union_prueba.bits_union.bit26); printf("%d",union_prueba.bits_union.bit27); printf("%d",union_prueba.bits_union.bit28); printf("%d",union_prueba.bits_union.bit29); printf("%d",union_prueba.bits_union.bit30); printf("%d",union_prueba.bits_union.bit31); printf("%d",union_prueba.bits_union.bit32); printf("\n\nTerminación normal del programa.\n"); } /* Programa de prueba para uniones, enteros y reales. Escriba el valor de un entero: 1 Lo que sigue es la estructura de bits del entero: 00000000000000000000000000000001 Escriba el valor de un float: 1 Lo que sigue es la estructura de bits del float: 00111111100000000000000000000000 Terminación normal del programa. */
printf
con 32 especificadores de formato
%d
. Se deja como ejercicio para el lector. En una vena más sofisticada, se puede crear una máscara deslizante (con el operador
<<
y un bucle
for()
, dando lugar a un código mucho más compacto. También es interesante emplear este programa para comprobar que los cálculos realizados
a mano
producen los mismos resultados que el ordenador.