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:
É 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. =)
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. =)