Array de bytes [RESOLVIDO]  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
efukuda
JavaChild

Membro desde: 20/07/2006 14:33:08
Mensagens: 114
Offline

Pessoal,

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



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

Agora veja o código abaixo:



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


This message was edited 1 time. Last update was at 01/08/2008 07:25:06

ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

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.

This message was edited 4 times. Last update was at 31/07/2008 20:20:25


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
efukuda
JavaChild

Membro desde: 20/07/2006 14:33:08
Mensagens: 114
Offline

Blz, não tinha percebido isso.

Abraços

ViniGodoy wrote: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.
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team