1. Quais tipos de números existem?
Em programação, trabalhamos constantemente com números — da idade do usuário ao número de estrelas na galáxia ou de centavos na conta bancária. Mas tarefas diferentes exigem tipos de números diferentes: às vezes é importante armazenar apenas inteiros, às vezes frações muito precisas e, em outras, números “sem sinal”.
Inteiros (int e outros)
Número inteiro é um número sem parte fracionária.
Em Java, o tipo mais usado é int, mas há várias outras opções que diferem em tamanho e faixa.
- int — o tipo “padrão” para inteiros. Ele comporta valores bem grandes (e pequenos) e não consome muita memória. Por exemplo, para contar curtidas, idade, quantidade de dias no ano, quase sempre será usado int.
- long — usado quando os valores podem ser muito grandes (por exemplo, bilhões ou trilhões). Exemplo: armazenar o total de visualizações do YouTube em toda a história.
- short — econômico, mas raramente usado. Indicado onde há muitos valores pequenos repetidos (por exemplo, dados de áudio, componentes de cor).
- byte — para valores ainda menores, especialmente em gráficos e trabalho com arquivos, quando a economia de memória é importante.
Números de ponto flutuante (double, float)
Às vezes é preciso trabalhar com números que têm parte fracionária. Por exemplo, temperatura do ar, média do aluno, preço do produto com centavos.
- double — é o tipo “padrão” para armazenar números fracionários. Preciso o suficiente para a maioria dos cálculos (exemplo: 3.1415926535…).
- float — tipo mais leve e menos preciso, mais comum em tarefas de computação gráfica ou no processamento de grandes arrays de dados, onde a economia de memória é importante.
Tipos numéricos especiais
- BigInteger — quando é preciso lidar com números enormes, além dos intervalos padrão, por exemplo, em criptografia ou em cálculos astronômicos.
- BigDecimal — classe para cálculos exatos com números fracionários (finanças, cálculo de juros), ajuda a evitar imprecisões típicas de double e float.
2. Faixas de valores
Tipos inteiros podem armazenar tanto números positivos quanto negativos. Isso é conveniente quando os valores podem ser “acima ou abaixo de zero”: por exemplo, temperatura, saldo da conta, altitude em relação ao nível do mar.
Exemplo:
- int : -10, 0, 50
- long : 0, 10, -1000_000_000_000_000_000L
Tipos inteiros
| Tipo | Tamanho | Faixa de valores | Exemplo de uso |
|---|---|---|---|
|
1 byte | -128 a 127 | -128, 0, 127 |
|
2 bytes | -32 768 a 32 767 | -1000, 0, 32000 |
|
4 bytes | -2 147 483 648 a 2 147 483 647 | -1000000, 0, 2000000 |
|
8 bytes | -9 223 372 036 854 775 808 até 9 223 372 036 854 775 807 |
-10_000_000_000, 1 |
Tipos de ponto flutuante
| Tipo | Tamanho | Exemplos de valores | Descrição |
|---|---|---|---|
|
4 bytes | 3.14f, -0.001f | precisão simples (7 dígitos) |
|
8 bytes | 3.1415, -1.7E+308 | precisão dupla (15–16 dígitos) |
3. Sufixos para números
Em algumas situações, é preciso indicar explicitamente qual tipo você quer usar para um número. Isso é feito com a ajuda de sufixos:
- L ou l — para o tipo long (por exemplo, 10000000000L)
- F ou f — para o tipo float (por exemplo, 3.14f)
- D ou d — para o tipo double (geralmente não é necessário, pois números fracionários sem sufixo são double)
Se o sufixo não for informado, por padrão um número inteiro é considerado int, e um número fracionário — double. Por exemplo, 42 é int, e 3.14 é double.
Por quê? Por exemplo, para não obter um erro ao atribuir um número muito grande a uma variável do tipo long:
long bigNumber = 9000000000L; // se remover o L, haverá erro de compilação
Separador com underscore _
Quando os números são longos, é fácil se confundir nos zeros. Para clareza e legibilidade, no Java é possível usar underscores dentro do número.
int population = 146_700_000;
long stars = 100_000_000_000L;
Isso é totalmente válido: o compilador ignora os underscores, e para você fica fácil ver as casas “de relance”. O principal — não colocar underscore no início, no fim, depois do ponto ou antes do sufixo.
4. Tipo de caractere char: o que é e para que serve?
O tipo char é usado para armazenar um único caractere: letra, dígito, sinal de pontuação, espaço, caractere especial e até emoji.
Exemplos:
char letter = 'A';
char digit = '7';
char symbol = '?';
char cyrillic = '\u0416';
char euro = '€';
char smile = '☺'; // Sim, isso também é possível!
Regras importantes:
- O valor do tipo char é escrito entre aspas simples: 'A', '7', '#'.
- É exatamente um caractere! Se você escrever 'AB', o compilador vai reclamar.
- Por trás de cada caractere há um código numérico (Unicode).
Unicode: caracteres do mundo inteiro
O Java usa o padrão Unicode, o que permite armazenar não apenas letras latinas, mas também cirílico, ideogramas, emojis e até hieróglifos do Egito Antigo (se algum dia for preciso).
Fato interessante:
O tipo char é, essencialmente, um número de 16 bits (de 0 a 65535), no qual cada valor corresponde a um caractere.
5. Caracteres e números: ligação via Unicode
Como cada caractere por baixo é um número, podemos converter tranquilamente char em int e vice-versa.
Exemplo: descobrir o código Unicode de um caractere
public class CharToInt {
public static void main(String[] args) {
char ch = 'A';
int code = ch; // Conversão implícita de char → int
System.out.println("Código do caractere '" + ch + "': " + code);
}
}
Resultado:
Código do caractere 'A': 65
E agora o contrário — obter o caractere a partir do código:
public class IntToChar {
public static void main(String[] args) {
int code = 1040; // Código da letra '\u0410' no Unicode (cirílico)
char ch = (char) code; // Conversão explícita de int → char
System.out.println("Caractere com o código " + code + ": " + ch);
}
}
Resultado:
Caractere com o código 1040: \u0410
6. Principais tipos primitivos do Java
| Tipo | Tamanho (bits) | Faixa de valores | Exemplo de valor | Observação |
|---|---|---|---|---|
|
8 | -128 ... 127 | 42 | Usado muito raramente |
|
16 | -32,768 ... 32,767 | 12345 | Para economia de memória |
|
32 | -2,147,483,648 ... 2,147,483,647 | 1000000 | Principal para inteiros |
|
64 | ≈ −9.22 × 1018 ... ≈ 9.22 × 1018 | 5000000000L | Para inteiros muito grandes |
|
32 | ~±3.4 × 10-38 ... ±3.4 × 1038 | 3.14f | Números fracionários, baixa precisão |
|
64 | ~±1.7 × 10-308 ... ±1.7 × 10308 | 2.718 | Números fracionários, alta precisão |
|
16 | 0 ... 65 535 (Unicode) | '\u0416', 'A', '?' | Um único caractere |
|
1 | true, false | true | Valor lógico |
GO TO FULL VERSION