Capítulo 002 Ejercicio 009 (Literales)

/** Generalmente al insertar un valor literal en un programa, el compilador sabe exactamente de qué tipo hacerlo.
* Sin embargo, en ocasiones, el tipo es ambiguo. Cuando ocurre esto es necesario guiar al compilador añadiendo
* alguna información extra en forma de caracteres asociados con el valor literal.
*
* El código siguiente muestra estos caracteres:
*/

class Literales {
char c = 0xffff; // Caracter máximo valor hexadecimal
byte b = 0x7f; // Máximo byte valor hexadecimal
short s = 0x7fff; // Máximo short valor hexadecimal
int i1 = 0x2f; // Hexadecimal (minúsculas)
int i2 = 0X2F; // Hexadecimal (mayúsculas)
int i3 = 0177; // Octal (Cero delantero)

// Hexadecimal y Octal también funcionan con long
long n1 = 200L; // Sufijo long
long n2 = 200l; // Sufijo long
long n3 = 200;

//! long 16(200); // Prohibido
float f1 = 1;
float f2 = 1F; // Sufijo float
float f3 = 1f; // Sufijo float
float f4 = 1e-45f; // 10 elevado a la -45
float f5 = 1e+9f; // Sufijo float

double d1 = 1d; // Sufijo double
double d2 = 1D; // Sufijo double
double d3 = 47e47d; // 10 elevado a la 47
}

/** La base 16 (hexadecimal), que funciona con todos los tipos de datos enteros, se representa mediante un 0x ó 0X
* delanteros, seguidos de 0-9 y a-f, tanto en mayúsculas como en minúsculas. Si se trata de inicializar una variable
* con un valor mayor que el que puede albergar (independientemente de la forma numérica del valor), el compilador
* emitirá un mensaje de error. Fíjese en el código anterior, los valores hexadecimales máximos posibles para char,
* byte y short. Si se excede de éstos, el compilador generará un valor int automáticamente e informará de la
* necesidad de hacer una conversión reductora para llevar a cabo la asignación. Se sabrá que se ha traspasado la línea.
*
* La base 8 (octal) se indica mediante un cero delantero en el número, y dígitos del 0 al 7. No hay representación
* literal de números binarios en C, C++ o Java.
*
* El tipo de un valor literal lo establecer un carácter arrastrado por éste. Sea en mayúsculas o minúsculas,
* L significa long, F significa float y D significa double.
*
* Los exponentes usan una notacíón que en ciertas ocasiones es desconcertante: 1,39 e-47f. En Ciencias e Ingeniería,
* la "e" se refiere a la base de los logaritmos naturales, aproximadamente 2,718. (Hay un valor double mucho más
* preciso en Java, denominado Math.E). Éste se usa en expresión exponencial, como 1,39 e-47, que quiere decir
* 1,39 X 2,718-47. Sin embargo, cuando se inventó FORTRAN se decidió que la "e" querría indicar "diez elevado a la
* potencia" lo cual es una mala decisión, pues FORTRAN fue diseñado para Ciencias e Ingeniería y podría pensarse
* que los diseñadores deben ser conscientes de que se ha introducido semejante ambigüedad. En cualquier caso, esta
* costumbre siguió en C y C++, y ahora en Java. Por tanto, si uno está habituado a pensar que "e" es la base de los
* logaritmos naturales, tendrá que hacer una traslación mental al ver una expresión como 1,39 e-47 en Java, significa
* 1,39*10-47.
*
* Nótese que no es necesario utilizar el carácter final cuando el compilador puede averiguar el tipo apropiado.
*
* Con
*
* long n3 = 200;
*
* no hay ambigüedad, por lo que una "L" tras el 200 sería superflua. Sin embargo con
*
* float f4 = 1e-47f; // 10 elevado a
*
* el compilador; normalmente, tomará los números exponenciales como double, de forma que sin la "f" arrastrada dará
* un error indicando que es necesario hacer una conversión de double en un float.
*/