Capítulo 002 Ejercicio 011 (Desbordamiento)

// ¡Sorpresa! Java permite desbordamientos.

/** En char, byte y short se puede ver el efecto de promoción con los operadores aritméticos. Cada
* operación aritmética que se haga con estos tipos genera como resultado un int, que debe ser explícitamente
* convertido para volver al tipo original (una conversión reductora que podría implicar pérdida de información)
* para volver a ser asignado a ese tipo. Con los valores int, sin embargo, no es necesaria ninguna conversión,
* porque todo es ya un int. Aunque no hay que relajarse pensando que todo está ya a salvo. Si se multiplican dos
* valores de tipo int lo suficientemente grandes, se desbordará el resultado.
*
* Esto se demuestra en el siguiente ejemplo:
**/

public class Desbordamiento{

public static void main(String args[]){
int grande = 0x7fffffff; // Valor entero máximo
visualizar("grande = " + grande);
int mayor= grande * 4;
visualizar("mayor = " + mayor);
}

static void visualizar(String s){
System.out.println(s);
}

}

/** La salida de esto es:
*
* grande = 2147483647
* mayor = -4;
*
* y no se recibe ningún error ni advertencia proveniente del compilador, ni excepciones en tiempo de ejecución.
*
* Java es bueno, pero no tanto.
*
* Las asignaciones compuestas no requieren conversiones para char, byte o short, incluso aunque esten
* llevando a cabo promociones que tienen los mismos resultados que los operadores aritméticos directos.
*
* Por otro lado, la falta de conversión, definitivamente, simplifica el código.
*
* Se puede ver que, con la excepción de boolean, cualquier tipo primitivo puede convertirse a otro tipo primitivo.
*
* De nuevo, debemos ser conscientes del efecto de la conversión reductora cuando se hace una conversión a un
* tipo menor. Si no, se podría perder información sin saberlo durante la conversión.
**/