Fácil C
Criando e usando uma union simples
Enunciado
Declare uma union chamada Numero que pode armazenar um int ou um float. No main, atribua um valor inteiro, imprima-o, depois atribua um valor float e imprima-o. Observe que apenas um valor é válido por vez.
Requisitos
- Declarar a union
Numerocom os membrosi(int) ef(float). - Atribuir e imprimir o valor inteiro.
- Atribuir e imprimir o valor float.
- A saída deve mostrar os dois valores corretamente.
Código inicial
#include <stdio.h>
// Declare a union aqui
int main() {
// Use a union
return 0;
}
Saída esperada
Inteiro: 10
Float: 3.14
Ver dica
Lembre-se de que, ao atribuir um novo valor, o anterior é sobrescrito. Use %.2f para imprimir o float.
Mostrar solução
#include <stdio.h>
// Union que pode armazenar int ou float
union Numero {
int i;
float f;
};
int main() {
union Numero n;
// Atribui e imprime inteiro
n.i = 10;
printf("Inteiro: %d\n", n.i);
// Atribui e imprime float (sobrescreve o int)
n.f = 3.14f;
printf("Float: %.2f\n", n.f);
return 0;
}
Passo a passo
- Declaramos a
union Numerocom dois membros:int iefloat f. Eles compartilham o mesmo espaço de memória. - No
main, criamos uma variávelndo tipounion Numero. - Atribuímos
10an.ie imprimimos com%d. Nesse momento, o valor inteiro é válido. - Em seguida, atribuímos
3.14fan.f. Isso sobrescreve os bytes que antes continham o inteiro. - Imprimimos
n.fcom%.2f, mostrando o valor float corretamente.
Por que funciona
A union aloca memória suficiente para o maior membro (no caso, float geralmente 4 bytes, int também 4 bytes). Ao acessar um membro, interpretamos os bytes armazenados de acordo com o tipo desse membro. Como só um valor é usado por vez, não há conflito.
Erros comuns
- Acessar o membro errado após a atribuição: se após
n.f = 3.14fvocê imprimirn.i, obterá um valor inteiro sem sentido, pois os bytes do float serão interpretados como int. Sempre use o membro correspondente ao último valor atribuído. - Esquecer o
fno literal float:n.f = 3.14;(semf) faz o compilador tratar como double e converter para float, mas é boa prática usar3.14f. - Imprimir com formato errado: usar
%dpara um float causa comportamento indefinido. Use%fpara floats.
Outra forma de resolver
Se você precisa armazenar ambos os valores simultaneamente, use uma struct em vez de union:
struct Numero {
int i;
float f;
};
Assim, ambos os campos coexistem, mas ocupam mais memória.
Saída esperada
Inteiro: 10
Float: 3.14