Médio C

Tamanhos e intervalos com sizeof e unsigned

Enunciado

Crie um programa que mostre o tamanho em bytes de int, char, float, double, short e long. Depois, declare uma variável unsigned int com o valor 4000000000 e imprima-a. Explique por que um int comum não poderia armazenar esse valor.

Requisitos

  • Usar sizeof para cada tipo listado.
  • Declarar e imprimir uma variável unsigned int com 4000000000.
  • Incluir um comentário no código explicando a diferença de intervalo entre int e unsigned int.

Código inicial

#include <stdio.h>

int main(void) {
    // Imprima os tamanhos

    // Declare e imprima o unsigned int

    return 0;
}

Saída esperada

int: 4 bytes
char: 1 bytes
float: 4 bytes
double: 8 bytes
short: 2 bytes
long: 8 bytes
Valor unsigned: 4000000000
Ver dica

sizeof retorna size_t, use %zu no printf. Para o unsigned, use %u.

Mostrar solução
#include <stdio.h>

int main(void) {
    // Tamanhos dos tipos básicos
    printf("int: %zu bytes\n", sizeof(int));
    printf("char: %zu bytes\n", sizeof(char));
    printf("float: %zu bytes\n", sizeof(float));
    printf("double: %zu bytes\n", sizeof(double));
    printf("short: %zu bytes\n", sizeof(short));
    printf("long: %zu bytes\n", sizeof(long));

    // unsigned int pode armazenar até 4.294.967.295 em 32 bits
    unsigned int valor = 4000000000U; // sufixo U indica unsigned
    printf("Valor unsigned: %u\n", valor);

    // Um int comum (signed) de 32 bits vai de -2.147.483.648 a 2.147.483.647,
    // então 4.000.000.000 não caberia.
    return 0;
}

Passo a passo

  1. Incluímos stdio.h para printf.
  2. Usamos sizeof(tipo) para obter o tamanho em bytes; %zu é o especificador para size_t.
  3. Imprimimos os tamanhos de int, char, float, double, short e long.
  4. Declaramos unsigned int valor = 4000000000U; — o sufixo U garante que o literal seja tratado como unsigned.
  5. Imprimimos com %u, o especificador para unsigned int.
  6. O comentário final explica que int signed de 32 bits só vai até ~2.1 bilhões, então 4 bilhões não caberia.

Por que funciona

sizeof é um operador que retorna o número de bytes ocupados por um tipo ou variável. unsigned int usa todos os 32 bits para magnitude, permitindo valores de 0 a 4.294.967.295, enquanto int reserva um bit para o sinal, indo de -2.147.483.648 a 2.147.483.647. O sufixo U evita avisos do compilador sobre conversão de literal.

Erros comuns

  • Usar %d para sizeof: printf("%d", sizeof(int)); — sizeof retorna size_t (unsigned long), então o correto é %zu.
  • Esquecer o U no literal: unsigned int valor = 4000000000; — o compilador pode avisar que o valor é grande demais para int.
  • Usar %d para imprimir unsigned int: printf("%d", valor); — imprime um valor negativo ou incorreto; use %u.

Outra forma de resolver

Poderia usar unsigned long para garantir 64 bits, mas o enunciado pede unsigned int. Em sistemas embarcados, int pode ter 16 bits, e aí 4 bilhões não caberia nem em unsigned int.

Saída esperada

int: 4 bytes
char: 1 bytes
float: 4 bytes
double: 8 bytes
short: 2 bytes
long: 8 bytes
Valor unsigned: 4000000000