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]