¿Para qué sirven las uniones?

Dudas sobre el C/C++ en general
Responder
Mensaje
Autor
EdwardRalia
Mensajes: 5
Registrado: 13/03/2019 7:22 am

¿Para qué sirven las uniones?

#1 Mensaje por EdwardRalia » 14/03/2019 9:14 am

Mi problema radica en que no se exactamente como funcionan las uniones, y para que sirven.

alguien puede darme una mano?

mollok
Mensajes: 397
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: ¿Para qué sirven las uniones?

#2 Mensaje por mollok » 16/03/2019 8:27 am

Una unión sirve para que una misma posición de memoria pueda ser tratada de diferentes formas. La unión tendrá el tamaño de la variable mas grande de las que guarda.

Por ejemplo:

Código: Seleccionar todo

union una_union {
    char c;
    int i;
    double d;
};
Genera un tipo de dato 'union una_union' donde las tres variables (c, i y d) empezaran en la misma dirección de memoria. En memoria esta unión tendrá el tamaño de d, al ser éste el tipo más grande. Al usar la misma dirección de memoria no se pueden usar al mismo tiempo dos de las variables ya que una 'machaca' el valor de la otra.

Su uso principal es no gastar memoria. De forma normal se usaría, al menos, sizeof(char) + sizeof(int) + sizeof(double) bytes de memoria, en verdad bastante más si el char se alinea con la memoria y gasta 4 bytes. Con el uso de la unión solo gastará sizeof(double) bytes. Cuando nación C los ordenadores tenían poca memoria así que esto era muy bueno.

Por otra parte puedes hacer cosas bastante interesantes. Por ejemplo, supongamos que durante el programa debes acceder a un entero y también bytes de forma individual:

Código: Seleccionar todo

union dato_compuesto {
    unsigned numero;
    char byte[sizeof(unsigned)];
};
Con esto, en el código puedes hacer:

Código: Seleccionar todo

#include <stdio.h>

union dato_compuesto {
    unsigned numero;
    unsigned char byte[sizeof(unsigned)];
};

int main() {
    union dato_compuesto mi_dato;

    mi_dato.numero = 0x00112233;
    for(int i = 0; i < 4; ++i) {
        printf("byte[%d] : %X\n", i, mi_dato.byte[i]);
    }
}
Para entender el resultado debes entender el endiandness de los procesadores.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados