2009-04-20 15 views
74

Parece que cuando escribe un número en Java, el compilador lo lee automáticamente como un entero, por lo que cuando escribe (largo) 6000000000 (no en el rango entero) lo hará Quejarse de que 6000000000 no es un número entero. Para corregir esto, tuve que especificar 6000000000L. Acabo de enterarme de esta especificación.Especificación del número L (largo) de Java

¿Hay otras especificaciones de número como short, byte, float, double? Parece que sería bueno tenerlos porque (supongo) si pudieras especificar que el número que estás escribiendo es corto, entonces Java no tendría que lanzarlo, eso es una suposición, corrígeme si me equivoco . Normalmente buscaría esta pregunta yo mismo, pero no sé cómo se llama este tipo de especificación de números.

Respuesta

143

Hay sufijos específicos para long (por ejemplo 39832L), float (por ejemplo 2.4f) y double (por ejemplo -7.832d).

Si no hay sufijo, y es un tipo integral (por ejemplo, 5623), se supone que es int. Si no es un tipo integral (por ejemplo, 3.14159), se supone que es double.

En todos los demás casos (byte, short, char), necesita el modelo porque no hay un sufijo específico.

La especificación Java permite que ambos sufijos de caso superior e inferior, pero se prefiere la versión en mayúsculas para long s, como la caja superior L es menos fácil de confundir con un numeral 1 de la caja inferior l.

Consulte el JLS section 3.10 para ver los detalles sangrientos (consulte la definición de IntegerTypeSuffix).

+7

El ingreso tardío: la eliminación de las posibles fuentes de ambigüedad es siempre bueno, y * No estoy en desacuerdo * ... pero creo que si usted se encuentra confuso '' 1' con l' y '0' con' O' (y así sucesivamente), su * prioridad * es establecer la fuente correcta (si puede), entonces preocúpese de asegurarse de no perder la tecla Shift. – davidcesarino

+0

@SimonNickerson Tengo una pregunta sobre sufijos ... Si declaro una variable _long_ o _double_ como: 'long _lo = 30;' y no '30L' ¿significa esto que mi variable se convertirá en _float_? O en el caso de '_lo = _lo + 2.77' que' _lo' se convertirá en _float_ aunque fue declarado como _long_ – luigi7up

+0

No, las carrozas no están involucradas aquí. En el primer caso, '30' es un' int' que se convierte automáticamente a través de una conversión de ampliación a 'long'.En el segundo caso, su declaración es ilegal. Tendría que lanzar explícitamente el lado derecho a largo, p. '_lo = (long) (_lo + 2.77)' –

0

considerar:

long l = -1 >>> 1; 

frente

int a = -1; 
long l = a >>> 1; 

Ahora usted esperaría molestarse fragmentos de código para dar el mismo valor a la variable l. Por lo tanto, necesitamos expresión en los literales int para que se haga como int s.

8

Estos son literales y se describen en section 3.10 de la especificación de lenguaje de Java.

12

espero que no le importe un ligero tangente, pero pensamos que puede estar interesado en saber que además de F (por flotación), D (por matrimonio), y L (por mucho tiempo), a proposal has been made para añadir sufijos para byte y shortY y S respectivamente. Esto eliminaría la necesidad de convertir a bytes cuando se utiliza la sintaxis literal para matrices de bytes (o cortas). Citando el ejemplo de la propuesta:

MAYOR BENEFICIO: ¿Por qué la plataforma es mejor si se adopta la propuesta?

código sucia como

byte[] stuff = { 0x00, 0x7F, (byte)0x80, (byte)0xFF}; 

se pueden recodificar como

byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy }; 

Joe Darcy está supervisando la moneda Proyecto para Java 7, y his blog ha sido una forma sencilla de realizar un seguimiento de estas propuestas.

+0

que estaría bien ... Siempre he encontrado que todos los moldes son realmente molestos – jbu

+0

Supongo que esto no llegó a Java 7. ¿Alguna noticia sobre si se convertirá en una actualización futura o Java 8? – crush

+0

@crush Intenté investigarlo hace unos meses, y por lo que pude ver, la propuesta había sido abandonada. Sin embargo, obtuvimos _ en literales numéricos y el prefijo '0b' para literales binarios. Alarido. – erickson

1

Parece que estos serían buenos para tienen porque (supongo) si pudiera especificar el número al que está escribiendo es un corto luego de Java no tendría que fundido que

Dado que el análisis sintáctico de literales ocurre en tiempo de compilación, esto es absolutamente irrelevante en lo que respecta al rendimiento. La única razón por la que tener los sufijos short y byte sería bueno es que conducen a un código más compacto.

3

Por defecto, cualquier tipo de datos primitivos integrales (byte, short, int, long) se tratarán como int type by java compiler. Para byte y corto, siempre que el valor asignado a ellos esté en su rango, no hay ningún problema ni sufijo. Si el valor asignado a byte y corto excede su rango, se requiere una conversión de tipo explícita.

Ex:

byte b = 130; // CE: range is exceeding. 

para superar este realice la conversión de tipos.

byte b = (byte)130; //valid, but chances of losing data is there. 

En caso de tipo de datos largo, puede aceptar el valor entero sin ningún tipo de molestia. Supongamos que asignamos como

Long l = 2147483647; //which is max value of int 

en este caso no se requiere un sufijo como L/l. Por defecto, el valor 2147483647 es considerado por el compilador java como tipo int. El compilador de tipo interno se realiza mediante el compilador y int se promociona automáticamente a Tipo largo.

Long l = 2147483648; //CE: value is treated as int but out of range 

Aquí tenemos que poner el sufijo como L para tratar el literal 2147483648 siempre el tipo de compilador Java.

por lo que finalmente

Long l = 2147483648L;// works fine. 
Cuestiones relacionadas