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
sizeofpara cada tipo listado. - Declarar e imprimir uma variável
unsigned intcom 4000000000. - Incluir um comentário no código explicando a diferença de intervalo entre
inteunsigned 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
- Incluímos
stdio.hparaprintf. - Usamos
sizeof(tipo)para obter o tamanho em bytes;%zué o especificador parasize_t. - Imprimimos os tamanhos de
int,char,float,double,shortelong. - Declaramos
unsigned int valor = 4000000000U;— o sufixoUgarante que o literal seja tratado comounsigned. - Imprimimos com
%u, o especificador paraunsigned int. - O comentário final explica que
intsigned 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
%dparasizeof:printf("%d", sizeof(int));—sizeofretornasize_t(unsigned long), então o correto é%zu. - Esquecer o
Uno literal:unsigned int valor = 4000000000;— o compilador pode avisar que o valor é grande demais paraint. - Usar
%dpara imprimirunsigned 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