Galera vcs sabem me dizer o porque da seguinte saída abaixo:
127 -128 -1 0
Eu sei q no byte só cabem 8 bits e com alguns números acima há um derramamento de bits (não sei se é assim ), mas aquela história de tentar guardar mais dados numa variável que comporta menos.
Alguém poderia me disser como descobrir os valores de saída neste exemplo, se cair na prova saberei fazer.
bytea=(byte)127;//OK nem seria necessário o cast explicito
no segundo:
byteb=(byte)128;
bom 128 é um valor positivo fora do intervalo então um cast explicito é necessario. Bom primeiro lembre-se que 128 é um literal inteiro e será visto dessa maneira pelo compilador: 0000 0000 0000 0000 0000 0000 1000 0000
quando vc realiza um cast explicito a VM ignora tudo que estiver após a extrema esquerda (transformando o int num byte) então ficaria assim: 1000 0000repare no bit da extrema esquerda o bit de sinal, como ele é negativo precisamos inverter os bits 0111 1111 e depois somar um :arrow: 1000 0000 assim obtemos como vc pode ver 128 positivo ae eh soh aplicar o sinal -128.
no terceiro:
bytec=(byte)255;
algo semelhante acontece a representação de 255 -lembrando que ele é um literal inteiro- seria assim: 0000 0000 0000 0000 0000 1111 1111
com o cast explicito os bits da extrema esquerda seriam desprezados e isso seria atribuido a c: 1111 1111 (bit da extrema esquerda 1 novamente então precisamos realizar a conversão)
invetendo os bits 0000 0000 e somando um pra obter o valor “verdadeiro” :arrow: 0000 0001 pronto 1, aplicando sinal -1.
no quarto e ultimo:
byted=(byte)256;
este é o mais simples, representação de 256:
0000 0000 0000 0000 0000 0001 0000 0000
com o cast explicito:
0000 00000 (como o bit da extrema esquerda é positivo (0) nenhuma conversão é necessária, então é isso mesmo que obtemos 0.
Bom espero que tenha ajudado.
raphael_nasci
valeu pela explicação, entendido agora.
T
Tjmm
Tem uma observação interessante a ser feita sobre os operadores de atribuição: +=, -=, *=, /=, %=, etc…
Eles fazem casting explícito automaticamente! Assim:
byte b = 5;
b += 35.6d; // Compila e roda perfeitamente!!!
Qualquer combinação de primitivos com os operadores de atribuição, compilam e rodam perfeitamente!