Ir ao conteúdo

Union ??????


cralx2k

Posts recomendados

Postado

Estou estudando union e fiquei com uma duvida.....se tenho 3 membros de uma uniao de valores:

Var.A=10

Var.B=15

var.C=16

send A uma variavel char, B uma variavel int e C uma variavel float.

1- O compilador vai reservar 4 bytes de memoria porque vai olhar para a variavel float....estou certo?

2- Sendo que todos as 3 variaveis ira ocupar o mesmo endereco de memoria, qaundo executar o codigo, o valor final da memoria sera 16.....estou certo?

3- qual a utilidade pratica para o uso da union?

Valeu galera

  • Membro VIP
Postado

Opa, tudo beleza?

1- O compilador vai reservar 4 bytes de memoria porque vai olhar para a variavel float....estou certo?

Sim. O tamanho da union é o tamanho do maior tipo dentro dela. O tamanho de cada tipo depende da arquitetura. Você pode saber o tamanho de tipos com o operador sizeof(), como fiz com o código abaixo. O operador sizeof() retorna o tamanho, em bytes, de um tipo.


#include <stdio.h>

union _U
{
char a;
int b;
float c;
} U;

void main(void)
{
printf("sizeof(char):\t%d\n", sizeof(char));
printf("sizeof(int):\t%d\n", sizeof(int));
printf("sizeof(float):\t%d\n", sizeof(float));
printf("sizeof(U):\t%d\n", sizeof(U));
}

2- Sendo que todos as 3 variaveis ira ocupar o mesmo endereco de memoria, qaundo executar o codigo, o valor final da memoria sera 16.....estou certo?

Não. Conforme explicado no item anterior, a union terá o tamanho do maior tipo. Se o float tem 4 bytes e ele é o maior tipo dentro dela, então o tamanho total da union é 4 bytes.

3- qual a utilidade pratica para o uso da union?

A graça toda está em justamente poder armazenar valores de diferentes tipos numa mesma variável (economia). Lembrando que os campos de uma union só podem ser utilizados um por vez. Ex.:


#include <stdio.h>

typedef union _U
{
char a;
int b;
float c;
} U;

void main(void)
{
U u;

u.a = 'A';
printf("%c\n", u.a);

u.b = 989898;
printf("%d\n", u.;

u.c = 3.4;
printf("%f\n", u.c);

printf("sizeof(U):\t%d\n", sizeof(U));
}

No código acima, utilizei os mesmos 4 bytes alocados para armazenar três tipos diferentes (um por vez). A palavra-chave é economia. ;)

Um abraço!

Postado

A resposta numero 1 você acabou tirando uma duvida que estava tento com um poutro post. Como meu SO e 64bits agora posso ver como o tamanho.

Nao tinha entendido sua resposta 2 mas depois ficou claro lendo a resposta 3.

Entendi seu codigo na resposta 3 com vai colocando os valores na memoria um de cada vez......mas ainda nao consegui ver the big picture.......

Valeu mesmo pela aula, você tem didatica.....por um acaso estou falando com um professor???

Uai....rodando o codigo mostrou esses valores:

sizeof(char): 1

sizeof(int): 4

sizeof(float): 4

sizeof(U): 4

agora nao entendi porque int esta com 4 e nao com 2bytes......sendo float 4 bytes

  • Membro VIP
Postado

Opa, que bom que ajudei. Não dou aulas de C não, mas agradeço o elogio.

O tamanho de cada tipo depende da arquitetura. Em geral, na x86 o int tem 4 bytes mesmo, assim como o float.

Com 4 bytes (32-bits), um int pode assumir de -2147483648 a 2147483647. Se você converter este último número para binário, verá que ele tem 31 bits, todos setados em 1. O bit restante é usado para armazenar o sinal (negativo ou positivo). Este é o signed int, que é usado por padrão quando você declara um int. Ou seja, fazer:

int a;

É o mesmo que fazer:

signed int a;

Portanto, o layout dos bits de um signed int é:

svvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

O sinal (s) é armazenado no primeiro bit e os outros 31 bits são usados para armazenar o valor (v).

Se você não quiser usar números negativos, pode declarar a varíavel como unsigned:

unsigned int a;

Neste caso, a faixa de valores que ela poderá assumir é de 0 a 4294967295. Você já deve ter percebido que se converter este último valor para binário, terá 32-bits setados em 1, ou seja, é o número máximo que pode ser armazenado em um inteiro de 32-bits.

Neste caso, o layout é mais simples:

vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

Todos os bits são usados para armazenar o valor (v). Perceba que o tipo pode armazenar o dobro do signed int, mas continua com os mesmos 4 bytes de tamanho. Não é feitiçaria, é tecnologia! haha

O float também tem 32-bits, mas seus bits são usados de maneira diferente:

seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm

O primeiro bit armazena o sinal (s), assim como no signed int.

Os 8 bits subsequentes, armazenam o expoente (e).

Os 23 bits finais armazenam a mantissa (m).

Em resumo, o número é m * 2^e // 2 elevado ao expoente

Como o valor é exatamente armazenado num float é um processo mais complexo pois várias situações precisam ser tratadas como casos especiais. O link a seguir dá mais informações: http://www.cprogramming.com/tutorial/floating_point/understanding_floating_point_representation.html

Estamos ainda com 32-bits. É tudo uma questão de trabalhar bit a bit (conhecido também como bitwise).

É importante lembrar que a maioria dos processadores atuais trabalham em little-endian, o que faz com que os bits sejam armazenados em ordem inversa. Então, nos casos anteriores, o bit de sinal seria o útlimo bit e a ordenação começaria nele.

Abraços!

Postado

Só para acrescentar algo que não ficou muito bem explicado, normalmente o que você poderia encontrar seria uma struct com uma union dentro e uma variável para dizer o tipo que está armazenado dentro da union. Seria um jeito de fazer um template em C, na prática mesmo ainda não achei um jeito muito interessante de usar unions mas é um recurso da linguagem, não tente achar usos para todas as coisas, as vezes alguns recursos da linguagem não são tão úteis assim ( pelo menos não para todo mundo ), e muitas vezes existem jeitos mais seguros e interessante de fazer as coisas.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...