Qual a diferença entre os tipos int, float e double em C?
Passo 1
O que a pergunta pede: explicar claramente as diferenças entre os tipos de dados básicos em C:
,
e
.
Informações relevantes que já temos (implícitas na pergunta): são tipos primitivos da linguagem C usados para armazenar números; cada um tem tamanho, precisão e comportamento diferentes. Vou listar essas diferenças passo a passo, com exemplos e dicas práticas.
Informações relevantes que já temos (implícitas na pergunta): são tipos primitivos da linguagem C usados para armazenar números; cada um tem tamanho, precisão e comportamento diferentes. Vou listar essas diferenças passo a passo, com exemplos e dicas práticas.
Passo 2
O que é
— conceito, tamanho e uso
- Definição simples:
armazena números inteiros (sem parte fracionária). Ex.: . - Tamanho: a norma C garante um tamanho mínimo, mas na prática em máquinas modernas típicas o
tem bytes (ou seja, bits). Isso pode variar (em algumas arquiteturas pode ser bytes, raramente outro). Para saber no seu compilador use . - Intervalo (para
-bit, típico): de até , ou seja de até . - Comportamento em overflow: se somar além do máximo, ocorre overflow (undefined behavior se for signed overflow) — cuidado!
- Exemplos de uso: contadores, índices de arrays, quantidades discretas.
- Observação sobre variantes: existem
, , — cada um muda tamanho/intervalo.
Passo 3
O que é
— representação, precisão e limitações
- Definição simples:
armazena números reais (com parte fracionária) em precisão de ponto flutuante de precisão simples. - Representação típica: segue IEEE-754 single precision em praticamente todas as arquiteturas modernas:
bits no total, divididos em bit de sinal, bits de expoente e bits de mantissa/fracionária. - Precisão: cerca de
a dígitos decimais significativos. Isso significa que números com mais dígitos significativos perdem precisão. - Alcance do expoente: aproximadamente até
(ordem de magnitude). - Exemplo prático de perda de precisão: se você guardar
os últimos dígitos podem não ser representados exatamente porque ultrapassa a precisão de dígitos. - Impressão e leitura: em
, argumentos de tipo são promovidos para nas funções variádicas, então usa-se para imprimir; em use para ler um (note a diferença). - Use quando: memória é crítica (grandes vetores em GPU/embedded) ou quando a precisão menor é aceitável e se deseja velocidade/menor uso de memória.
Passo 4
O que é
— representação, precisão e vantagens
- Definição simples:
também armazena números reais, mas com precisão dupla. - Representação típica: IEEE-754 double precision:
bits totais, com bit de sinal, bits de expoente e bits de mantissa. - Precisão: cerca de
a dígitos decimais significativos — muito superior ao . - Alcance do expoente: aproximadamente até
. - Literais em C: um literal como
é do tipo por padrão; para criar um literal use . - Impressão e leitura:
funciona para (e é promovido a em ). Em , use para . - Use quando: precisa de precisão numérica confiável em cálculos científicos, financeiros (com cautela) e em quase toda rotina numérica geral.
Passo 5
Comparações práticas: precisão, tamanho e desempenho
- Tamanho em bytes típicos (comum em PCs):
, , . (Mas confirme com no seu sistema.) - Precisão:
dígitos decimais; dígitos decimais. - Exemplo intuitivo de diferença: se um
tem dígitos de precisão, então o número não é representado com todos os dígitos corretos; um consegue representar com muito mais precisão números grandes ou frações pequenas. - Performance: em CPUs modernos, operações em
frequentemente são quase tão rápidas quanto em . Em GPUs/embedded o pode ser muito mais rápido e ocupar menos memória, então a escolha depende do hardware. - Erros numéricos: comparações diretas de números de ponto flutuante são perigosas — prefira comparar com uma tolerância (epsilon).
Passo 6
Regras e armadilhas importantes (literais, promoções, scanf/printf, comparação)
- Literais:
é ; é ; é . - Promoção aritmética: em expressões aritméticas,
é promovido a quando necessário (conversões usuais). Assim, . - scanf/printf:
-
espera um ; se passar um ele já foi promovido para . -
lê para . -
lê para .
-
- Comparação com epsilon: para testar igualdade aproximada, faça algo como:
-
… (escolha o conforme a precisão necessária).
-
- Overflow vs overflow de ponto flutuante:
- Para
: overflow signed é UB; unsigned wrap-around definido. - Para
: existe representação de e (não um erro UB).
- Para
Passo 7
Exemplos curtos para fixar (lembre-se de testar no seu compilador)
- Declarações:
-
- Impressão:
-
-
// é promovido para double -
// “%lf” também funciona no printf em muitos sistemas, mas “%f” é o usual para double; prefira “%f” para printf e “%lf” para scanf.
-
- Verificar sizeof:
-
Passo 8
Recomendações práticas rápidas (quando usar cada um)
- Use
para valores inteiros (contadores, índices). Se precisar de números inteiros maiores sem sinal, use ou tipos com largura garantida ( ). - Use
como escolha padrão para números reais em aplicações científicas e para evitar perda de precisão. - Use
quando memória/performance ou hardware (GPU, DSP, microcontroladores) exigirem, ou quando a precisão de dígitos for suficiente.
Resposta
int: tipo para números inteiros; tipicamente
bytes em arquiteturas modernas (intervalo típico
a
), sem parte fracionária e com risco de overflow em operações que ultrapassam o intervalo.
float: ponto flutuante de precisão simples; tipicamente
bits (
bit sinal,
bits expoente,
bits mantissa); precisão ~
–
dígitos decimais e alcance ~
; usa-se
para literais float.
double: ponto flutuante de precisão dupla; tipicamente
bits (
bit sinal,
bits expoente,
bits mantissa); precisão ~
–
dígitos decimais e alcance ~
; literal padrão para números de ponto flutuante em C é
(
).