Union vs struct , campo de bit

Iniciado por bash, 10 Abril 2015, 22:49 PM

0 Miembros y 1 Visitante están viendo este tema.

bash

Buenas a todos !!!


Hoy vengo con otra duda , se el uso basico de las uniones y las estructuras pero me gustaria que me explicaran cual es la ventaja de usar estructura y ventaja de usar uniones

pondre un ejemplo mas abajo para ver si me doy a enteder mejor

Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

  int main(){

   struct stTest{
     char caracter;
     int entero;
  };
  stTest test1;
  test1.caracter= 'a';
  test1.entero   = 1;
 
  cout << test1.caracter << test1.entero <<endl;
  /////Esto simplemente imprime : a1
  union  unTest{
    char caracter;
    int    entero;
  };
unTest test2;
   test2.caracter= 'a';
  test2.entero   = 1;
cout << test2.caracter << test2.entero <<endl;
  /////Esto simplemente imprime : @1

}




Entiendo que en las uniones todos los campos comparte el mismo espacion de memoria
eso es importante pero pero por que se usa mucho .. alguien me puede dar ejemplos de  caso de uso por favot , y aparte alguien me puede explicar eso de los campos de bit.

no soy nuevo pero nunca lo he usado y quisiera comprender para que se usa pero los cursillos , libro que he visto no me dejan entender el por que y para que eso y algunas cosas, Gracias de antemano.
gracias por responder mis dudas

ivancea96

Código (cpp) [Seleccionar]
struct P{
    bool a:1;
    bool b:1;
    bool c:1;
    bool d:1;
    bool e:1;
    bool f:1;
    bool g:1;
    bool h:1;
};


Ahí el tamaño de la estructura es de 1 byte: cada campo tiene solo 1 bit.


Una union es lo que has dicho, y no hay más. Puede ser una forma de ahorrar memoria, o simple comodidad.

avesudra

La union se usa algunas veces para proporcionar métodos alternativos de acceso:

typedef union
{
    struct
    {
        int32_t low;
        int32_t high;
    };
    struct
    {
        int16_t low_16;
        int16_t middleLow_16;
        int16_t middleHigh_16;
        int16_t high_16;
    };
    struct
    {
        int8_t one_8;
        int8_t two_8;
        int8_t three_8;
        int8_t four_8;
        int8_t five_8;
        int8_t six_8;
        int8_t seven_8;
        int8_t eigth_8;
    };
    int64_t dword;
}_register;

int main()
{
    _register rax;
    eax.dword = 1000;
    printf("%064X\n", eax.dword);
    printf("%032X\n", eax.high);
    printf("%032X\n", eax.low);

    return 0;
}

Por ejemplo eso, para acceder a las distintas partes de un registro de 64 bits.
Regístrate en