Essa discussão é totalmente teórica e especulativa, no sentido de eu saber que são regras imutáveis e como diz o ditado “Pau, pau, pedra, pedra”, mas eu realmente fiquei muito curioso. Hoje finalmente eu comecei meu tão sonhado caminho no mundo Java, quando digo começar é começar mesmo, do zero, baixando o JDK, instalando o IntelliJ, ficando encantado com o poder da JVM… EIS QUÊ! eu vou estudar sobre Tipos Primitivos e… me deparo com as seguintes informações:
int
O tipo int é utilizado para representar valores numéricos inteiros de 32 bits. É um dos tipos de dados mais utilizados para representar números inteiros em Java e possui uma faixa de valores de -2.147.483.648 a 2.147.483.647.
long
O tipo long é utilizado para representar valores numéricos inteiros de 64 bits. Ele é utilizado para representar valores inteiros muito grandes e possui uma faixa de valores de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807.
Qual é a desses números? Por que são tão quebrados? Qual a lógica que define suas fronteiras numéricas? Algum dia serei poderoso ao ponto de ultrapassa esses valores? Hahahaha Obrigado comunidade!
Os valores são assim porque é o que cabe na quantidade de bits que cada um tem.
Basicamente, os números são armazenados usando o método chamado complemento de 2.
Por exemplo, supondo que queremos usar apenas 4 bits, e se temos os bits 0011: para saber o valor, basta fazer:
0 x 23 + 0 x 22 + 1 x 21 + 1 x 20
Ou seja, 0011 em binário representa o número decimal 3. Cada posição representa uma potência de 2, com os expoentes crescendo da direita para a esquerda.
Se quisermos que seja um tipo com sinal (signed), como é o caso do Java, o primeiro bit igual a 1 indica que o número é negativo. Por exemplo, 1011: o primeiro bit é 1, então é negativo. Para saber o valor, invertemos os bits (0100) e somamos 1 (0101, que corresponde a 5), ou seja, 1011 é o -5.
De forma geral, se tivermos N bits, o menor valor possível é -2N - 1 e o maior, 2N - 1 - 1.
Daí esses valores tão “quebrados”. Não tem como ultrapassá-los. Se vc fizer um cálculo que estoura esse valor, ocorre o overflow: o valor é “truncado”. Pense no hodômetro de um carro: depois que chega a 999999 quilômetros, ele volta para o zero (não cabe 7 dígitos pra representar 1 milhão, então os dígitos excedentes são perdidos).
Bem-vindo e uma dica. Não busque por material de computação que presta em português. É muito mais fácil você achar conteúdo que vale alguma coisa de verdade em inglês do que em português. Não estou falando que não tenha coisa boa em português. Aqui mesmo tem várias pessoas muito competentes, mas, via de regra, vá direto no inglês. Existem várias motivações para int ser um inteiro de 32 bits e long ser um inteiro de 64 bits, todas caindo geralmente em como o processador funciona (qual a quantidade de bits que ele processa em cada microinstrução) e para manter compatibilidade entre arquiteturas de 32 e 64 bits. Veja a discussão abaixo.
E por mais que isso tudo se pareça algo absurdamente demorado para o processador dar conta, pode ficar tranquilo, pois é o básico do básico do básico do básico do básico… do que um processador faz. Se algo assim te deixou boquiaberto, fico imaginando o que vc vai sentir quando começar a ver computação de verdade. Bons estudos e boa sorte.