Promoção Numérica
Agora que você entende os fundamentos dos operadores aritméticos, é vital falarmos sobre promoção numérica, como Java pode fazer coisas que parecem incomuns para você em primeiro lugar. Se você lembrar no Capítulo 1, "Blocos de Construção Java", onde listamos os tipos numéricos primitivos, cada primitivo tem um comprimento de bit. Você não precisa saber o tamanho exato desses tipos para o exame, mas você deve saber qual é maior. Por exemplo, você deve saber que o long ocupa muito mais espaço do que um int, que por sua vez ocupa mais espaço do que um short e assim por diante.
Você deve memorizar certas regras que o Java seguirá ao aplicar os operadores aos tipos de dados:
Regras de promoção numérica
1. Se dois valores tiverem tipos de dados diferentes, o Java promoverá automaticamente o menor tipo de dados para o maior.
2. Se um dos valores é inteiro e o outro é ponto flutuante, o Java automaticamente promove o valor inteiro para o tipo de dados do valor de ponto flutuante.
3. Os tipos de dados menores, ou seja, byte, short e char, são promovidos primeiramente a qualquer momento para int no momento em que forem usados com um operador aritmético binário Java, mesmo que nenhum dos operandos seja int.
4. Após toda a promoção ter ocorrido e os operandos tiverem o mesmo tipo de dados, o valor resultante terá o mesmo tipo de dados da ultima promoção.
As duas últimas regras são aquelas com as quais a maioria das pessoas tem problemas, e as que podem atrapalhar você no exame. Para a terceira regra, observe que operadores unários são excluídos desta regra. Por exemplo, aplicar ++ a um valor short resulta em um valor short. Discutiremos os operadores unários na próxima seção.
Vamos abordar alguns exemplos para fins ilustrativos:
■ Qual é o tipo de dados de x * y?
int x = 1;
long y = 33;
Se seguirmos a primeira regra, que um dos valores é long e o outro é int, como o long é maior que int, então o valor int é promovido para long e o valor resultante é long.
■ Qual é o tipo de dados de x + y?
double x = 39.21;
float y = 2.1;
Esta é realmente uma questão complicada, pois este código não será compilado! Como você pode se lembrar do Capítulo 1, os valores literais de ponto flutuante são considerados double, a menos que sejam pós-fixados com um f, como em 2.1f. Se o valor foi definido corretamente para 2.1f, a promoção seria semelhante ao último exemplo, com os dois operandos sendo promovidos para um double e o resultado seria um valor double.
■ Qual é o tipo de dados de x / y?
short x = 10;
short y = 3;
Nesse caso, devemos aplicar a terceira regra, ou seja, x e y serão promovidos para int antes da operação, resultando em uma saída do tipo int. Preste muita atenção ao fato de que a saída resultante não é short, pois retornaremos a este exemplo na próxima seção sobre operadores de atribuição.
■ Qual é o tipo de dados de x * y / z?
short x = 14;
float y = 13;
double z = 30;
Neste caso, devemos aplicar todas as regras. Primeiro, x será automaticamente promovido para int apenas porque é short e está sendo usado em uma operação binária aritmética.
O valor de x será promovido automaticamente para float para que possa ser multiplicado por y. O resultado de x * y será automaticamente promovido para um double, para que possa ser dividido por z, e o resultado será um valor double.
Veja um exemplo utilizando todos os tipos primitivos:
public class Promocao {
public static void main(String[] args) {
byte a = 10;
short b = 21;
int c = 32;
long d = 43L;
float e = 54.5F;
double f = 65.4D;
double result = (a * b / c * d / e * f);
System.out.println(result);
}
}
Resultado gravado em result:
309.5999959945679