7 Apr
Continuando meu passeio pelas entranhas do Java, mais uma surpresa.
O que você acha que acontece com o seguinte código?
public class Teste {
public static void main(String []args){
byte a = 2;
byte b = 3;
byte c = a + b;
}
}
Não compila. Você troca byte por short. Também não compila. Troca por char e ainda não compila.
Isso acontece porque a VM considera que a probabilidade de você estourar o tamanho de um tipo pequeno quando faz alguma operação com ele é muito grande. Pensem. Se você colocar 64 em dois byte e somá-los, você já terá estourado. Até que faz um pouco de sentido, né?
Mas e nesse caso em que o código compila?
public class Teste {
public static void main(String []args){
byte a = 2;
a += 100;
}
}
Aparentemente somar 100 a VM deixa, mas e agora:
public class Teste {
public static void main(String []args){
byte a = 2;
a = a + 1;
}
}
Isso não compila. Dá erro porque a VM considera o 1 como int e um int nunca vai caber dentro de um byte. O outro caso funciona por algum motivo estranho… Você pode adicionar o quanto quiser com += que continua compilando, mesmo que estoure a variável. A única forma de forçar o terceiro exemploa a compilar é:
public class Teste {
public static void main(String []args){
byte a = 2;
a = (byte)(a + 1);
}
}
Isso compila porque você força o cast e assume toda a responsabilidade por qualquer erro que possa ocorrer. Mas o segundo exemplo é realmente perturbador….
Posts Relacionados:
3 Responses for "INC - Pequeno + Pequeno == Grande?"
O que acontece no segundo exemplo é que os operadores de atribuição composta ( =, -=, *=… é essa mesma a tradução correta para ‘compound assignment’?) fazem um cast implícito para o tipo da variável que está recebendo o valor. Quanto aos demais exemplos, basta lembrar que todo literal inteiro é um int, assim como todo literal de ponto flutuante é um double, a não ser que você use um sufixo para indicar o tipo (ex.: 0.0f). Da mesma forma, toda operação aritmética com int ou valor menor resulta num int (se houver um float ou double, resulta num double).
Pois é, foi o que o Paulo Silveira me explicou esses dias. Quando você usa a “atribuição composta” (se é esse nome mesmo ;)) ele coloca um cast. Mas ainda assim acho que é algo meio estranho.
Obrigado pela visita!
hehe realmente… eu odiava ter que me preocupar com este tipo de coisa quando programava em java. Isso é porque você tá tratando com numeros simples, imagina quando vc começar a manipualr datas, valores monetarios, e afins?
Outras linguagens resolvem isso com mais praticidade…mas java é java. Acho que essencialmente, há questões mais importantes para o programador se preocupar, do que dar ‘cast’s ,tipagens etc:P
Leave a reply