Array de bytes [RESOLVIDO]

Pessoal,

Estou com um problema e não estou conseguindo resolver. Segue o os códigos abaixo:

		List<Integer> lista = new ArrayList<Integer>();
		
		lista.add(1);
		lista.add(2);
		lista.add(3);
		lista.add(4);
		
		Iterator<Integer> itera = lista.iterator();
		byte[] bytes = new byte[4];
		int i = 0;
		while(itera.hasNext()){
			int val = itera.next();
			bytes[i] = (byte) val;
			System.out.println(bytes[i]);
			i++;
		}

No código acima está imprimindo os números 1, 2, 3 e 4. Até ai tudo bem.

Agora veja o código abaixo:

		List<Integer> lista = new ArrayList<Integer>();
		
		lista.add(1234);
		lista.add(3344);
		lista.add(5444);
		lista.add(6565);
		
		Iterator<Integer> itera = lista.iterator();
		byte[] bytes = new byte[4];
		int i = 0;
		while(itera.hasNext()){
			int val = itera.next();
			bytes[i] = (byte) val;
			System.out.println(bytes[i]);
			i++;
		}

Na situação acima está imprimindo -46, 16, 68 e -91

Os números que estão sendo adicionados na lista é diferente dos números impressos.

Alguém sabe por que isso acontece?

Abraços

Ué, um byte vai de -128 até 127. E tem exatamente 8 bits.

Vamos pegar o primeiro número que vc escreveu, em binário.
Os 16 bits dele poderiam ser escritos assim:
1234 -> 00000100 11010010
(O inteiro tem 32 bits, mas seriam só mais 16 zeros na frente).

Agora retire os 8 bits menos significativos, que é a capacidade de um byte:
1234 -> 00000100 11010010

Isso é o valor binário que foi gravado após a conversão. Agora, vamos ver como o Java vai fazer para entende-lo.

Como a variável do tipo byte tem sinal, o primeiro bit (destacado em negrito) representa o sinal de negativo:
11010010

Os demais bits, são o número mesmo. O Java usa complemento de 2, portanto, para descobrir o valor do resto dos bits (que não ficaram em negrito), basta inverte-los, converter para decimal e somar 1. Essa inversão e soma só é necessária para números negativos.
1010010 invertidos são 0101101. O valor 0101101 em decimal é 45. 45+1=46.

Logo, o número 1234, truncado para um único bit é -46. Aplique esse processo para o resto dos números para entender a conversão.

Note que houve mesmo perda de informação. E o resto foi interpretado como podia.
O número final realmente perde o sentido.

Blz, não tinha percebido isso.

Abraços

[quote=ViniGodoy]Ué, um byte vai de -128 até 127. E tem exatamente 8 bits.

Vamos pegar o primeiro número que vc escreveu, em binário.
Os 16 bits dele poderiam ser escritos assim:
1234 -> 00000100 11010010
(O inteiro tem 32 bits, mas seriam só mais 16 zeros na frente).

Agora retire os 8 bits menos significativos, que é a capacidade de um byte:
1234 -> 00000100 11010010

Isso é o valor binário que foi gravado após a conversão. Agora, vamos ver como o Java vai fazer para entende-lo.

Como a variável do tipo byte tem sinal, o primeiro bit (destacado em negrito) representa o sinal de negativo:
11010010

Os demais bits, são o número mesmo. O Java usa complemento de 2, portanto, para descobrir o valor do resto dos bits (que não ficaram em negrito), basta inverte-los, converter para decimal e somar 1. Essa inversão e soma só é necessária para números negativos.
1010010 invertidos são 0101101. O valor 0101101 em decimal é 45. 45+1=46.

Logo, o número 1234, truncado para um único bit é -46. Aplique esse processo para o resto dos números para entender a conversão.

Note que houve mesmo perda de informação. E o resto foi interpretado como podia.
O número final realmente perde o sentido.[/quote]