[RESOLVIDO]Casting int para byte

Boa noite pessoal.

Estou convertendo uma aplicação desenvolvida em Java para C++ ( :roll: ) e me deparei com o seguinte método:

public static byte toByte(int valor) { if (valor >= 0 && valor <= 127) { return (byte) valor; } return (byte) (-(256 - valor)); }

Seguem alguns valores de entrada e o que o método retorna:

4129 --> 33
8258 --> 66

Como em C++ não há o tipo byte, gostaria de entender exatamente o que este cast está fazendo com os bits.

Desde já agradeço pela atenção.

Bom, a primeira parte é simples:

  public static byte toByte(int valor) {  
           if (valor >= 0 && valor <= 127) {  
               return (byte) valor;  
           }  

A Faixa de valores que 1 byte pode representar vai de 0 a 127.
Então esse if faz a comparação, se o valor passado estiver entre essa faixa de valores, é feito um cast explícito
do valor passado. Nesse caso, não há perda de informação.

Já na segunda parte não entendi muito bem esse cálculo, confesso que fiquei curioso:

 return (byte) (-(256 - valor));  

Não mesmo… Um byte pode representar de 0 a 255.

Ainda estou decifrando o resto…

Pronto…

É resposta tá num nível mais baixo que programadores de java normalmente se interessam…
A representação binária de um número (short, int, long) e do byte é feita em complemento de dois,
que é uma forma muito comum de se tratar um número na eletrônica quando ele pode ser negativo.

Nesse padrão o bit mais significativo é interpretado como o bit de sinal.
Ele vale ZERO quando o número é positivo e UM quando o número é negativo.
Desta forma, se a conversão fosse feita simplesmente pegando o byte menos significativo do int,
um bit que antes somava passaria a subtrair, representando um erro se ele valesse UM.

Tirando o parêntese você pode ler aquela conta (-(256-valor)) como (valor-256).
Essa subtração basta pra corrigir o bit de sinal. =)

Engano seu meu querido, e meu também.
a faixa de valores vai de -128 a 127 :smiley:

1 byte = 8 bits

  • ( 2 ^ 7 ) até [ ( 2 ^ 7 ) - 1 ]

elevado a 7 porque 1 bit é pra guardar o sinal
e -1 porque inclui o 0

desculpa

Não precisa se desculpar , afinal, nós 2 erramos né?
rsrsrsrsrsrs
Eaí conseguiu desvendar o ‘mistério’?

Obrigado pelas respostas… pelo que entendi, é o seguinte:

4129 = 1000000100001 em binário

com (-(256 - valor)) acredito que esteja sendo removido o primeiro byte, restando apenas o ultimo (00100001), que é igual a 33.

Concordam?

sim, na verdade se eu não estivesse errado e o byte fosse mesmo unsigned, como é o byte normalmente definido em C++ (daí o equívoco…),
o cast no java não seria tão complicado e este tópico não existiria. =)

ah, calma aí, gente, deixa eu rabiscar aqui XD

:smiley:

A título de curiosidade, segue o método em C++ que resolveu meu problema:

int toByte(int valor){ if(valor &gt;= 0 && valor &lt;= 127) { return (char) valor; } return (char) (-(256-valor)); }

Mais "buchas" virão, mas meu café acabou… hehehe… muito obrigado pessoal e até mais!!! :lol: