Tabla de Contenidos
Conversiones de tipos primitivos
En Java, convertir directamente un tipo de datos a otro tipo se conoce como casting
.
Las conversiones entre tipos de datos solo se pueden hacer cuando los 2 tipos de datos involucrados, guardan una relación.
Esto ocurre solo con los tipos de datos numéricos y con los char
.
Existen dos tipos de conversiones:
- Casting implícito: se hacen de forma automática al asignar un tipo a otro, sin que hagamos nada.
- Casting explícito: debemos controlar e indicar nosotros la conversión.
Valores literales convertibles
'b' | char | 2 bytes |
42 | int | 4 bytes |
42L | long | 8 bytes |
22.3454F | float | 4 bytes |
22.3345 | double | 8 bytes |
Los tipos byte
y short
no son muy usados en Java por lo que no tienen repesentación literal. Simplemente se usa un valor literal int
que cumpla el rango apropiado para el tipo.
Casting implícito
Automáticamente podemos asignar un valor literal o una variable de un tipo de dato, a otra variable de un tipo distinto, siempre convierta de un tipo a otro tipo más a la derecha, de los siguientes:
Esto quiere decir que no necesitamos escribir ningún tipo de código para pasar de un tipo de datos a otro.
Se da cuando “metemos” un valor pequeño en un contenedor (variable) más grande.
//Ambos literales son literales de int, pero cumplen el rango de cada tipo byte varPequena = 127; short varGrande = 12365; //Convierto de literal int a variable long long enteroGrande = 24556; //Convierto de tipo long a tipo float float decimalSimple = enteroGrande; //Convierto de float a double double decimalDoble = decimalSimple; //Convierto de literal float a double decimalDouble = 3.14F;
Casting explícito
Se dan cuando intento asignar un tipo de datos más grande a una variable más pequeña.
El formato del casting es: (tipo)valorAConvertir;
(Donde el tipo es el tipo al que se quiere convertir, y valorAConvertir, el valor desde el que se quiere convertir).
//una variable int ocupa 4 bytes, short 2 bytes int entero = 13; short enteroPequeno = (short)entero; long numeroLargo = 13; entero = (int)numeroLargo; double decimal = 23423.234234; entero = (int) decimal;
Casting caracter-entero
En algunos lenguajes de programación existe una relación entre los caracteres y los número enteros.
Los caracteres se codifican atendiendo al estandar ISO/IEC 8859-1. Los 128 primeros caracteres de esa tabla correponden con el estándar ASCII:
La codificación iso 8859-1 (latín), amplia ASCII con 128 caracteres usados en las lenguas occidentales:
En dichas tablas existe una correspondencia entre el nº de orden del caracter y la representación literal del caracter.
Por lo tanto hay una serie de conversiones implícitas y explícitas que se permiten entre los tipos int
y char
:
//Casting implícito char letraA = 65; //valor ASCII -> 'A' int valorA = letraA; int valorB = 'B'; //entero ASCII -> 66 //Casting explícito char letraB = (char)valorB; //convierto de int a char
Aspectos a tener en cuenta
Todas estas cuestiones están indicadas en la documentación sobre las especificaciones del lenguaje Java.
- Cualquier operación aritmética entre dos tipos de datos inferiores a
int
produce como resultado unint
:
byte enteroByte = 4; short enteroShort = 6; short resultado = enteroByte + enteroShort; //Error //Soluciones short resultado = (short)(enteroByte + enteroShort); int resultado = enteroByte + enteroShort;
- Cualquier operación aritmética entre dos tipos de datos distintos, produce como resultado un tipo de datos igual al tipo mayor:
long enteroLargo = 12; int entero = 234; entero * enteroLargo; // resultado tipo long double decimal = 23.234; entero - decimal; // resultado tipo double
- Siempre existe riesgo de pérdida de datos al hacer un casting de un tipo más grande hacia un tipo más pequeño:
int entero = 263;
El contenido de la variable entero
(4 bytes) es:
00000000-00000000-00000001-00000111
Al hacer un casting a tipo byte
:
byte numero = (byte)entero;
La variable byte solo tiene 8 bits, por lo que solo se está guardando el último byte de la variable entero
:
00000111
cuyo valor es 7.
- Pérdida de precisión de tipos reales: Si intentamos asignar un valor entero muy grande a este tipo de datos (float o double), se realiza un casting implícito, pero hay riesgo de pérdida de datos.
Casting entre objetos
No puedo asignar directamente un objeto a una variable de otro tipo de objeto, a no ser que guarden una relación de herencia.
Tampoco puedo realizar un casting primitivo-objeto, a no ser mediante la relación primitivo - clase envoltorio de primitivo.
© 2025 Fernando Valdeón