2009-09-18 14 views

Respuesta

22

Después de probar un programa simple (utilizando 0 y 100, para mostrar la diferencia entre constantes "especiales" y generales), el compilador Sun Java 6 generará el mismo bytecode para 1 y 2 (los casos 3 y 4 son idéntico a 2 en lo que respecta al compilador).

Así, por ejemplo:

double x = 100; 
double y = 100.0; 

compila a:

0: ldc2_w #2; //double 100.0d 
3: dstore_1 
4: ldc2_w #2; //double 100.0d 
7: dstore_3 

Sin embargo, no puedo ver nada en la especificación del lenguaje Java garantizando este tiempo de compilación ensanchamiento de expresiones constantes. Hay tiempo de compilación estrechamiento de casos como:

byte b = 100; 

como se especifica en section 5.2, pero eso no es exactamente lo mismo.

Tal vez alguien con los ojos más agudos que yo puedo encontrar una garantía alguna parte ...

+0

¿Podría sugerir un buen recurso donde se pueda leer sobre qué significa ldc2_w y las otras instrucciones? –

+2

La especificación de JVM: http://java.sun.com/docs/books/jvms/ –

2

Los últimos 3 deben ser idénticos. El literal del lado derecho ya es un doble. La 'd' o la 'D' están implícitas cuando tienes un literal decimal.

El primero es ligeramente diferente en que 0 es un int literal, que se ampliará a un doble. No sé si eso produce código de bytes diferente en este caso o no; el resultado debería ser idéntico de todos modos.

+0

Gracias por la respuesta, sé que los resultados son idénticos, quiero saber las diferencias bajo el capó. –

+0

Para "0.0", "0.0d" y "0.0D" realmente no hay diferencias bajo el capó. Esas son tres formas de escribir un doble literal, todas son exactamente equivalentes. – Jesper

-2

para Java No lo sé exactamente, en C esto puede ser realmente peligroso si se omite esta D al final, ya que no cambiará los bytes superiores, lo que puede tener un efecto que en su variable es un número que en realidad no ¡meter en!

En Java tuve un gran problema con la instalación de BigDecimal: el nuevo BigDecimal (0) y el nuevo bigDecimal (0L) NO es lo mismo, puede sentirlo si migra el código de Java 1.4 a Java 1.5. No sé por qué fueron descuidados al respecto, tal vez tenían que hacerlo de esa manera.

+1

Tu respuesta no responde la pregunta. Lo que está sucediendo en C no es relevante y tampoco lo es tu experiencia con BigDecimals. –

13

Para el primero de ellos:

double dummy = 0; 

el literal entero 0 se convierte en una doble con una conversión primitiva ensanchamiento , vea 5.1.2 Widening Primitive Conversion en la Especificación del lenguaje Java. Tenga en cuenta que esto es hecho completamente por el compilador, no tiene ningún impacto en el bytecode producido.

Para los demás:

double dummy = 0.0; 
double dummy = 0.0d; 
double dummy = 0.0D; 

Estos tres son exactamente lo mismo - 0.0, 0.0d y 0.0D son sólo tres formas diferentes de escribir un double literal. Ver 3.10.2 Floating-Point Literals en el JLS.

Cuestiones relacionadas