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 Numero com os membros i (int) e f (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

  1. Declaramos a union Numero com dois membros: int i e float f. Eles compartilham o mesmo espaço de memória.
  2. No main, criamos uma variável n do tipo union Numero.
  3. Atribuímos 10 a n.i e imprimimos com %d. Nesse momento, o valor inteiro é válido.
  4. Em seguida, atribuímos 3.14f a n.f. Isso sobrescreve os bytes que antes continham o inteiro.
  5. Imprimimos n.f com %.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.14f você imprimir n.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 f no literal float: n.f = 3.14; (sem f) faz o compilador tratar como double e converter para float, mas é boa prática usar 3.14f.
  • Imprimir com formato errado: usar %d para um float causa comportamento indefinido. Use %f para 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