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));
A
Alfredo_Barbosa
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. =)
F
fredericoengels
Engano seu meu querido, e meu também.
a faixa de valores vai de -128 a 127
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
A
Alfredo_Barbosa
desculpa
F
fredericoengels
Não precisa se desculpar , afinal, nós 2 erramos né?
rsrsrsrsrsrs
Eaí conseguiu desvendar o ‘mistério’?
S
seudito
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?
A
Alfredo_Barbosa
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. =)
A
Alfredo_Barbosa
ah, calma aí, gente, deixa eu rabiscar aqui XD
S
seudito
A título de curiosidade, segue o método em C++ que resolveu meu problema:
int toByte(int valor){
if(valor >= 0 && valor <= 127)
{
return (char) valor;
}
return (char) (-(256-valor));
}
Mais "buchas" virão, mas meu café acabou… hehehe… muito obrigado pessoal e até mais!!! :lol: