Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

byte incrementado estranhamente

Eu estava fazendo uns testes com laço e me deparei com essa dúvida: o tipo byte aceita valores entre -128 até 127. Eu fiz um for que rodará eternamente, e ele incrementa a variável primitiva byte. A dúvida: Ao chegar no último valor válido para um byte, a variável é incrementada com o PRIMEIRO Valor possível, por quê?

Meu simples código:

for(byte i = 0; true; i++) System.out.println(i);
2 respostas

Tudo bem Matheus?

Quando você estoura o limite de um primitivo numérico, ele "dá a volta" e retorna ao primeiro valor possível.

O byte, por exemplo, suporta de -128 a 127. Quando o seu laço incrementar o i para o que seria 128, o valor dentro dele será -128. Pois você atingiu maior o valor possível do byte e em seguida ele volta para o primeiro valor possível, e assim por diante.

Da mesma forma atribuir 129 para o byte resulta em -127 (segundo valor possível, pois você passou dois valores além do que o byte consegue guardar).

Faz sentido? Abraço!

solução!

Olá Matheus!

Pra gente entender o que tá acontecendo, precisamos ver como os números são representados em binário. Só para facilitar e não tornar o exemplo muito extenso, vamos supor que um byte fosse representado com apenas 3 bits. Desse modo, teríamos os números seriam representados da seguinte forma em binário:


0 = 000b
1 = 001b
2 = 010b
3 = 011b
4 = 100b
5 = 101b
6 = 110b
7 = 111b

Legal! Mas desse modo gastamos todos os bits para representar os números de 0 a 7.

E se precisássemos ter número negativos?

Precisaríamos distribuir a mesma quantidade de bits para representar também os números negativos. Poderíamos dividir esses 8 números em 2 e ter de 1 até 4 positivos e de -1 a -4 negativos... mas e o zero? Temos que considerá-lo também então vamos tirar um dos números positivos e criar a seguinte representação (chamada de complemento de 2):


 0 = 000b
 1 = 001b 
 2 = 010b
 3 = 011b
-4 = 100b
-3 = 101b
-2 = 110b
-1 = 111b

Perceba que agora conseguimos representar todos os números no intervalo de -4 até 3. Perceba também que utilizamos o bit mais a esquerda para indicar se o número é positivo ou negativo. Se ele vale 0, o número é positivo. Se ele vale 1 então é negativo.

Essa representação específica ainda tem a vantagem de facilitar os cálculos em binário pois podemos fazer a operação diretamente em binário. Exemplo de soma:


 1 = 001b
-3 = 101b +
-----------
-2 = 110b

Agora vamos voltar ao problema que você levantou na sua dúvida. Se o byte começa valendo 0, então a sua representação em bits ficaria 00000000b. Conforme vão sendo executadas as iterações do for, esse número vai aumentando até chegar em 127 cuja representação em binário ficaria 01111111b. Agora se somarmos mais 1 nesse número teríamos o seguinte resultado:


 127 = 01111111b
   1 = 00000001b +
------------------
-128 = 10000000b

Note que a operação causa a mudança do valor do bit mais a esquerda e de acordo com a representação de complemento de 2, isso significa que temos um número negativo. Por isso temos aquele comportamento aparentemente estranho no for que você apresentou. A sequência vai ser primeiro imprimir todos os positivos começando no 0 e depois todos os negativos começando no menor número possível.