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.