Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Uniones. Dos dudas

Estas en el tema de Uniones. Dos dudas en el foro de C/C++ en Foros del Web. Bueno, por fin me he puesto a estudiar y comprender de verdad la respuesta de eferion que planteé en su día : En ella , ...
  #1 (permalink)  
Antiguo 28/11/2014, 05:14
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Uniones. Dos dudas

Bueno, por fin me he puesto a estudiar y comprender de verdad la respuesta de eferion que planteé en su día:

En ella , se hace uso de una union, tipo de estructura que no estoy acostumbrado a usar, así que he empezado a trastear con ella para enterarme un poco.

Y hago esta prueba:
Código C++:
Ver original
  1. union U
  2. {
  3.     int numero;
  4.     char letra;
  5. };

y luego:
Código C++:
Ver original
  1. U caracter;
  2.     //caracter.letra='A';
  3.     caracter.numero=67;
  4.  
  5.     cout<<"La letra: "<<caracter.letra<<" tiene el ASCII "<<caracter.numero<<endl;
  6.  
  7.     char numero='W';

Bien, entonces parece que guardo un valor en el miembro numero. Como dicho valor es compartido por el miembro letra, cuando lo leo me saca su correspondiente valor char. Hasta ahí bien.

Pero si descomento la línea que está comentada y comento la otra, no obtengo un resultado correcto.

¿Alguien sabe decirme qué no estoy entendiendo de las uniones?
Gracias por adelantado.

(En el encabezado pongo "dos dudas". En breve voy a poner la otra)
__________________
Mi calculadora en Qt
  #2 (permalink)  
Antiguo 28/11/2014, 05:27
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Uniones. Dos dudas

un int ocupa 4 bytes, mientras que un char, 1 byte. Lo que hace la union es que ambas estructuras puedan ocupar las mismas posiciones en memoria... pero eso no quiere decir que ambas ocupen lo mismo.

Cuando asignas el valor al int estás modificando el valor de 4 bytes, mientras que al asignar un valor al char estás modificando únicamente 1 byte... los otros 3 no verán alterado su valor. Por eso al imprimir el int ves un resultado erróneo.

Un ejemplo con valores:

Código C++:
Ver original
  1. // Como no esta inicializada la memoria, suponemos un valor aleatorio:
  2. // numero = 67458154 o 0x0405546A
  3. // letra = j o 0x6A
  4. U caracter;
  5.  
  6. // Modificamos el char
  7. // numero(hex) = 67458113 o 0x04055441
  8. // letra = A o 0x41
  9. caracter.letra = 'A';

Como ves, "letra" únicamente modifica el último byte correspondiente a "numero", el resto permanece inalterado.
  #3 (permalink)  
Antiguo 28/11/2014, 05:44
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Uniones. Dos dudas

Vaya, muchas gracias por la respuesta.

Voy a terminar de pelearme con lo otro que tengo entre manos y seguramente envío la 2ª duda relacionada con uniones
__________________
Mi calculadora en Qt
  #4 (permalink)  
Antiguo 28/11/2014, 07:38
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Uniones. Dos dudas

Eso es así porque estás en una máquina llittle-endian. Si probaras lo mismo en una big-endian el resultado hubiera sido el que esperabas.
https://en.wikipedia.org/wiki/Endianness

Etiquetas: char, dudas, int, numero
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:07.