Herramientas de usuario

Herramientas del sitio


bloque2:casting

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
42int4 bytes
42Llong8 bytes
22.3454Ffloat4 bytes
22.3345double8 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 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 actualmente 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

  • 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.


© 2020 Fernando Valdeón

bloque2/casting.txt · Última modificación: 23/10/2019 18:49 por Fernando Valdeón