A lo largo de este cuso se enseñan muchas cosas y llega a un punto donde te pasan lo que es el <ins>cast</ins> que es cuando intentas transformar un tipo de dato a otro un ejemplo claro sería este
int num = 16;
byte age = (byte) num; //el resultado es 16 y no ocurre ningún problema
Recordar de todas maneras que siempre es ideal aplicar ciertas reglas a la hora de implementarlo para evitar posibles fallos, cómo por ejemplo
no castear de tipos de datos mayores a menores. Recordemos que los tipos de datos tienen un orden de tamaño que pueden soportar. y se detallan claramente a lo largo del curso.
byte > short > int > long
Siendo el <ins>byte</ins> el de menor tamaño y <ins>long</ins> el de mayor tamaño. En ésta guía solo trabajaremos con números enteros.
Pero seamos sinceros, en la realidad pocos hacen caso a esta regla y hacen conversión de datos por doquier. Sin embargo, seguramente si lo han hecho se habrán topado con algo así.
short y = (short)1921222; //Almacena 20678 WTFF!!
Haber espera… ¿por qué si yo quiero traspasar el numero 1921222 a <ins>short</ins> me lo transforma a un numero nada que ver?. 20678.
Bueno lo que acaba de pasar aquí se le conoce como overflow (desbordamiento) , que es cuando intentas convertir un número a un tipo de dato que está fuera de rango del tipo de dato. Recordemos los rangos que tienen cada tipo de dato.
byte: Ocupa 1 byte de memoria y su rango es de -128 hasta 127.
short: Ocupa 2 bytes de memoria y su rango es de -32,768 hasta 32,727.
int: Ocupa 4 bytes de memoria y su rango es de -2,147,483,648 hasta 2,147,483,647. Es muy cómodo de usar, ya que no es tan pequeño para que no quepan nuestros números ni tan grande como para desperdiciar mucha memoria. Puede almacenar hasta 10 dígitos.
long: Ocupa 8 bytes de memoria y su rango es de -9,223,372,036,854,775,808 hasta 9,223,372,036,854,775,807. Para diferenciarlo de un tipo de dato long debemos terminar el número con la letra L.
Si nos fijamos bien <ins>short</ins> abarca un rango desde -32,768 hasta 32,727, y el número que queremos castear es el 1921222 a <ins>short</ins>. Es esta fuera de los límites de <ins>short</ins> pero por muchoo!!, entonces la maquina se traba y te lo transforma a un número cualquiera, en este caso es el 20678.
¿Pero realmente se traba y te transforma a cualquier numero?. La respuesta es simplemente NO, la ciencia no es magia y la computación tampoco, todo pasa por algo y nada ocurre porque sí. ¿Entonces que ocurre?.¿Por qué Java me esta arrojando 20678 cuando se produce un overflow?.
Bueno lo que sucede es que al momento de hacer el casteo a un número, Java convierte dicho número a número binario.
en este caso el numero que convertirá a binario es el numero a transformar 1921222, que transformado a binario daría 111010101000011000110111010101000011000110 y toma los primeros 16 bits de derecha a izquierda quedando así 0101000011000110 y este mismo lo transforma a número quedando el santo numero de 20678
IMPORTANTE: Recordemos que el número de bits a sacar va por tipo de dato, en este caso al tipo de dato que quieres transformar.
byte = 8 bits
short =16 bits ( que fue el que usamos en este caso porque el tipo de dato a transformar era short)
int = 32 bits
long = 64 bits