java types numbers integer default

¿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!