Conversión de tipos
Conversión de tipos o casting
Por otro lado, debemos tener en cuenta cual será el tipo de dato del resultado de una operación aritmética, tomando en cuenta los tipos de datos de los operandos. Esto se conoce como conversión de tipos o casting.
En muchas ocasiones, es necesario convertir un tipo de dato a otro, ya sea para realizar una operación aritmética o para asignar un valor a una variable.
En Java, existen dos tipos de conversión de tipos: conversión implícita y conversión explícita.
Conversión implícita
La conversión implícita o generalización (widening) es aquella que se realiza automáticamente por el compilador, sin necesidad de indicar que debe realizarse. Esta conversión se realiza cuando el tipo de dato de un operando es “más pequeño” que el tipo de dato del otro operando.
Por ejemplo, si queremos sumar una variable de tipo int
con una variable de tipo float
, el compilador realizará una conversión implícita de tipo int
a tipo float
. Esto se debe a que la representación de un número int
es “más pequeña” que la representación de un número float
, lo que podría llevar a una pérdida de precisión en la operación.
1int num1 = 5;2float num2 = 5.5f;3float suma = num1 + num2; // 10.5
En este caso, el tipo de dato de num1
es int
, mientras que el tipo de dato de num2
es float
. Como el tipo de dato de num1
es “más pequeño” que el tipo de dato de num2
, el compilador realiza una conversión implícita de tipo int
a tipo float
, y luego realiza la suma.
La siguiente secuencia muestra el orden de los tipos de datos numéricos de menor a mayor tamaño y por tanto los tipos de conversión implícita que se pueden realizar:
byte
→ short
→ char
→ int
→ long
→ float
→ double
Conversión explícita
Por el contrario, podemos encontrarnos con casos en los que necesitemos que el resultado de una operación aritmética sea de un tipo de dato específico, distinto al tipo de dato de los operandos y sin la posibilidad de realizarse una conversión implícita. En estos casos, debemos realizar una conversión explícita o especialización (narrowing).
Por ejemplo, si nos encontramos trabajando con números de punto flotante y queremos que el resultado de una operación sea de tipo int
, debemos realizar una conversión explícita de tipo float
a tipo int
.
Para realizar una conversión explícita, debemos indicar el tipo de dato al que queremos convertir el valor, entre paréntesis, antes del valor que queremos convertir.
1float num1 = 5.5f;2float num2 = 5.5f;3int resultado;4resultado = (int) (num1 + num2); // 11
En el ejemplo anterior, el tipo de dato de num1
y num2
es float
, mientras que el tipo de dato de resultado
es int
. Al realizar la operación de adición num1 + num2
, el resultado será de tipo float
(11.0f
). A pesar de que la parte decimal del resultado es 0
, el compilador no realiza una conversión implícita de tipo float
a tipo int
, por lo cual no podríamos asignarlo directamente a la variable resultado
.
En este caso, debemos realizar una conversión explícita de tipo float
a tipo int
, para que el resultado de la operación sea de tipo int
.
La siguiente secuencia muestra el orden de los tipos de datos numéricos de mayor a menor tamaño y por tanto los tipos de conversión explícita que se pueden realizar:
double
→ float
→ long
→ int
→ char
→ short
→ byte
Por supuesto, la razón de realizar una conversión explícita es que el tipo de dato de destino no puede almacenar el valor del tipo de dato de origen. Por ejemplo, si queremos almacenar el valor 10000000000
en una variable de tipo int
, no podría realizarse una conversión implícita de tipo long
a tipo int
, ya que el valor máximo que puede almacenar una variable de tipo int
es 2147483647
. Sin duda, esto nos llevaría a una pérdida de precisión.