Cast de tipos primitivos..(resolvido)

9 respostas
antoniopopete

Eu acho incrivel determinadas coisas que tem no java 1.4…Por exemplo,voce pode fazer a seguint atribuição:

byte b = 10;
Sabemos que por default 10 é um literal int,então temos uma atribuição de inteiro a um byte que é resolvida de forma implicita pelo compilador.
Se tentarmos a seguinte operação:

byte a = 10;

byte b  = 20;

byte c = a+ b;

Ocorre erro de compilação,pois o compilador informa que há perda de presição…Bastante genial esse pessoal que pensou nisso…Muito mais simples deixar fazer tudo ou nada.

9 Respostas

Adriano_Almeida

Ué mas o que há de errado nisso? Agora o compilador virou mãe Dinah pra saber que o seu A e o seu B vão ter uma soma que vai caber dentro de um valor byte?

antoniopopete

Corrijindo minha ignorância, existe sim, um sentido em o compilador não permitir isso, pois ele em tempo de compilação ou execução, não tem como reconhecer os valores e analisar o resultado daquela operação se vai estar dentro da faixa do tipo primitivo, por isso se torna obrigatório o uso de cast.

LPJava

byte c = (byte)a+ b; mesmo se fizer nao vai? alais um byte aceita ate 16 bits ne?

Deh
byte c = (byte) a + b;

não vai, porque você está somente converntendo o "a" para byte
e ficaria "byte + int = int"... (pelo menos é o que eu acredito que ocorra, nesse caso)

um cast correto seria:

byte c = (byte) (a+ b);
derheimen

Detalhando mais oque todos estão dizendo, olha esse exemplo
de atribuição a tipos primitivos com uma expressão:

byte x = 6; //sem problemas
byte y = 4; //sem problemas
byte z = x + y; //a soma cabe em um byte, mas ocorre um erro em tempo de compilação.

Lembre-se que um inteiro literal é sempre um tipo int implicitamente
Lembre-se também que o resultado de uma expressão que envolva
um literal do tamanho de um int, ou menor será sempre um int.

eltonk

Quer ver algo mais estranho?

01 public class TesteCast {
02    public static void main(String[] args) {
03       byte a = 10; //ok
04       metodoA(a); //ok
05       metodoA(10); //ERRO!!
06    }
07 
08    private static void metodoA(byte b){
09    }
10 }

O compilador poderia ser um pouco mais inteligente ali né…
Atribuir o valor literal 10 a um byte (linha 03) o compilador consegue ver que é compatível, mas ao passar o mesmo valor literal 10 (linha 05) para um método o compilador não faz a mesma coisa…

Reilander

eltonk:
01 public class TesteCast { 02 public static void main(String[] args) { 03 byte a = 10; //ok 04 metodoA(a); //ok 05 metodoA(10); //ERRO!! 06 } 07 08 private static void metodoA(byte b){ 09 }

Bom, fiz uns testes aqui e interpretei da seguinte maneira:
Por mais que atribuir um int a um byte possa acarretar numa possível perder de precisão, um byte, no fim das contas, pode ser representado por um inteiro, e não ao contrário. Assim, o compilador analisa quais inteiros, numa atribuição de int a um byte, podem ser representados em um byte.
Ex:

public class Teste { public static void main( String args[] ) { byte a = 127; // ok byte b = 128; // erro: "possible loss of precision } }
No código acima, 127 pode ser representado por um byte, mas não 128.
Quanto à passagem do parâmetro, ele não permite o 10 por incompatibilidade de tipos. Na atribuição a "a", 10 foi convertido em um byte, e a é um byte. Logo, na passagem de argumentos, é byte para byte.
Contudo, ainda fica uma pergunta:
Já que ele permite isso com int -&gt byte, porque não permitir double -&gt int?
Ex:

O compilador deveria também verificar quais valores doubles poderiam ser atribuídos a um int sem perda de precisão.
Vai entender…

iwallas

O problema não é precisão, o Java tem uma regra para isso:

Toda operação realizada com int e tipos primitivos “menores” que ele retornarão um int, sempre.

Então:

byte + byte = int
short + short = int
byte - short = int
int - short = int

Se o resultado sempre será int, não tem como armazenar um int dentro de um short ou byte.

derheimen

Foi o que eu disse mais acima… :roll: Mas de qualquer forma valeu… :lol:

Criado 30 de janeiro de 2007
Ultima resposta 5 de fev. de 2007
Respostas 9
Participantes 8