Cast automático de byte para char

7 respostas
T

Por que não ocorre um cast automático do tipo "byte" para o tipo "char" ? Um byte não cabe sempre em um char?

public class TestByte {  
     public static void main(String[] args) {  
          byte b =1;   
          char b2 = 3;  
          char b3 = (byte) (b + b2);

          System.out.println(b3);  
     }  
}

7 Respostas

V

porq vc está realizando uma operação de soma de um byte + char…
vou dar um exemplo:
o limite do char é de 65000(estou arredondando)…
imagine que nessa operação de soma de byte + char o valor ultrapsse o limite máximo do tipo char…
por isso é necessário usar o cast neste caso para evitar que ocorra isso…

T

Acho que eu formulei mal a pergunta… A questão é que o código acima NÃO compila! Pra mim era pra compilar pois um byte cabe em um char… É essa minha dúvida.

V

ah sim…
agora eu entendi a sua dúvida…
o código não funciona…
troque:

char b3 = (byte) (b + b2);

por 

char b3 = (char) (b + b2);
T
vmsb11:
ah sim.... agora eu entendi a sua dúvida.... o código não funciona.... troque:
char b3 = (byte) (b + b2);

por 

char b3 = (char) (b + b2);

Mas então, eu sei que se fizer essa troca o código vai funcionar... Mas a minha dúvida é por que não funciona com o cast para (byte) ... É essa minha dúvida!

rodrigo.bossini
char c = (byte) 126;//compila ok!
char c = (byte) 127;//compila ok!
char c = (byte) 128;//não compila mais!

Agora você consegue descobrir sozinho pq seu código não compila.

T
rod.attack:
char c = (byte) 126;//compila ok!
char c = (byte) 127;//compila ok!
char c = (byte) 128;//não compila mais!
Agora você consegue descobrir sozinho pq seu código não compila.

Seguindo esse seu raciocínio, por que então o seguinte código compila normalmente?

public class OutroTeste
{
	public static void main(String...$){
		int x = (int) 123456789123456789L;
		long x2 = (int) 123456789123456789L;
	}
}

O compilador neste caso não avisa nada sobre perda de precisão e tal...

rodrigo.bossini

Eu quis dizer que, para valores pequenos (até 128 ) o compilador é capaz de verificar o bit pattern desse valor (obviamente em tempo de compilação) e dizer que ali ocorreria (COM CERTEZA) a perda de precisão.

Outro exemplo:

char c1 = (byte)127;//compila, o valor está hard-coded, o compilador consegue checar o bit pattern e  que o valor é menor que 128
char c2 = (byte) 128;//não compila pelo mesmo motivo
byte b1 = 1; byte b2 = 2;
char c3 =  (byte)b1 + b2; // não compila!!  1+ 2 = 3 < 128, porém o compilador não consegue enxergar esses valores! (ele não sabe quais valores as variáveis b1 e b2 conterão em tempo de execução)

Agora o seguinte:

int i = (int)1l;

É óbvio que há possível perda de precisão e o compilador enxerga isso. Mas com o casting explícito você está avisando ele que tudo bem, vc está ciente da possível perda e arcará com as possíveis consequencias.
Lembrando novamente que o compilador somente é capaz de verificar o bit pattern dos números menores que 128 que estiverem digitados explicitamente no código.

Criado 6 de fevereiro de 2010
Ultima resposta 7 de fev. de 2010
Respostas 7
Participantes 3