Cast explícito

4 respostas
raphael_nasci
public class Cast {

static byte a = (byte)127, b = (byte)128, c = (byte)255, d = (byte)256;

public static void main(String args[]) {

System.out.print(a + " " + b + " " + c + " " + d);

}

}

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.

Valeu.

4 Respostas

ricardolecheta

este post deve ajudar,

http://www.guj.com.br/posts/list/8450.java

Java_Vinicius_Machin

Bom no primeiro:

byte a = (byte) 127; //OK nem seria necessário o cast explicito

no segundo:

byte b = (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 0000 repare 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:

byte c = (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:

byte d = (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. :smiley:

raphael_nasci

valeu pela explicação, entendido agora.

T

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!

[]'s Tjmm.

Criado 25 de janeiro de 2005
Ultima resposta 25 de jan. de 2005
Respostas 4
Participantes 4