¿Por qué valor de basura en entero de unión?

Para el siguiente progtwig, int se imprime con valor de basura, pero se espera que sea el valor inicializado 50. ¿Hay alguna razón específica para este valor en la salida?

#include  #include  union data { int a; float c; char b[10]; }; int main() { union data x; xa = 50; strcpy(xb,"hello"); xc = 21.50; printf ("xa:= %d\n",xa ); printf ("xb:= %s\n",xb ); printf ("xc:= %f\n",xc ); return 0; } 

Salida:

 xa:= 1101791232 xb:= xc:= 21.500000 

Actualización: para un progtwig similar como se menciona a continuación, todo funciona bien, no tengo pistas de cómo esto podría producir los resultados esperados

 #include  #include  union Data { int i; float f; char str[20]; }; int main( ) { union Data data; data.i = 10; printf( "data.i : %d\n", data.i); data.f = 220.5; printf( "data.f : %f\n", data.f); strcpy( data.str, "C Programming"); printf( "data.str : %s\n", data.str); return 0; } 

Salida:

 data.i : 10 data.f : 220.500000 data.str : C Programming 

Un sindicato utilizará la misma ubicación de almacenamiento para todos sus miembros. Establece xa pero luego, cuando establece xc también sobrescribe la ubicación de memoria de xa .

En binario, el valor entero 1101791232 es el mismo que el valor flotante 22.50 , y puede verificar fácilmente que:

  float f = 21.50; int * iP = (int*)&f; cout << *iP; 

Los datos de la unión se ven algo así en la memoria (cada X es un byte):

 XXXXXXXXXX <- union data XXXX <- int a XXXX <- float c XXXXXXXXXX <- char b[10] 

Así que escribir en a o c sobrescribirá al otro, más los primeros 4 elementos de la matriz de caracteres.

En cuanto a su segundo ejemplo, intente configurar los tres miembros y solo después emita sus valores, y volverán a ser basura. Solo funciona porque se imprime inmediatamente después de configurar y antes de sobrescribir.

El punto central de las uniones es que establecer un valor anula todos los demás valores.

Lo último que establece en la unión es c=21.50 . El valor de a será entonces los bits de 21.50 como si representaran un int.

El valor de 21.50 es 0x41ac0000 (consulte el convertidor de flotación a hexadecimal ) que el envío a int es 1101791232 (consulte el convertidor de hex a decimal ).