¿Hay un tipo predeterminado para números en Java
types numbers (2)
El JLS-4.2.1 - Tipos y valores integrales
Los valores de los tipos integrales son enteros en los siguientes rangos:
- Por
byte
, de -128 a 127, inclusive- Para
short
, de -32768 a 32767, inclusive- Para
int
, de -2147483648 a 2147483647, inclusive- Por
long
, desde -9223372036854775808 hasta 9223372036854775807, inclusive- Para
char
, de ''/ u0000'' a ''/ uffff'' inclusive, es decir, de 0 a 65535
Y JLS-3.10.1 - Literales enteros
Un literal entero es de tipo largo si tiene el sufijo de una letra ASCII L o l (ell); de lo contrario, es de tipo int (§4.2.1).
Finalmente, JLS-3.10.2 - Literales de punto flotante incluye
Un literal de coma flotante es de tipo flotante si tiene el sufijo de una letra ASCII F o f; de lo contrario, su tipo es doble y, opcionalmente, puede tener el sufijo de una letra ASCII D o d (§4.2.3).
En cuanto al
byte b = 3;
Es una
conversión estrecha
de
int
a
byte
.
Si escribo algo como esto
System.out.println(18);
¿Qué tipo tiene el ''18''? ¿Es int o byte ? ¿O aún no tiene un tipo?
No puede ser int, porque algo como esto es correcto:
byte b = 3;
Y esto es incorrecto:
int i = 3;
byte bb = i; //error!
EDITAR: Creo que encontré la parte correcta en la especificación en Conversión de asignación :
El estrechamiento en tiempo de compilación de las constantes significa que el código como:
byte theAnswer = 42;
esta permitido. Sin el estrechamiento, el hecho de que el entero literal 42 tenga el tipo int significaría que se requeriría una conversión al byte:
byte theAnswer = (byte) 42; // el lanzamiento está permitido pero no es obligatorio
Esta
18
se conoce como un
entero literal
.
Hay todo tipo de
literals
, coma flotante,
String
, carácter, etc.
En el siguiente,
byte b = 3;
El literal
3
es un entero literal.
También es una expresión constante.
Y dado que Java puede decir que
3
caben en un
byte
, puede aplicar de forma segura una
conversión primitiva estrecha
y almacenar el resultado en una variable de
byte
.
En esto
int i = 3;
byte bb = i; //error!
el literal
3
es una expresión constante, pero la variable
i
no lo es.
El compilador simplemente decide que dado que
i
no es una expresión constante y, por lo tanto, no se esfuerza por averiguar su valor, una conversión a
byte
puede perder información (¿cómo convertir
12345
en un
byte
?) Y, por lo tanto, no debería ser permitido.
Puede anular este comportamiento convirtiendo
i
una variable constante
final int i = 3;
byte bb = i; // no error!
o especificando un reparto explícito
int i = 3;
byte bb = (byte) i; // no error!