2009-09-18 7 views

risposta

22

Dopo aver provato un semplice programma (utilizzando sia 0 e 100, per mostrare la differenza tra costanti "speciali" e generali) il compilatore Sun Java 6 genererà lo stesso bytecode sia per 1 che per 2 (i casi 3 e 4 sono identico a 2 per quanto riguarda il compilatore).

Così, per esempio:

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 

Tuttavia, non riesco a vedere nulla nel linguaggio Java Specification garantendo questa fase di compilazione ampliamento delle espressioni costanti. Non c'è tempo di compilazione restringimento per i casi come:

byte b = 100; 

come specificato nella section 5.2, ma che non è proprio la stessa cosa.

Forse qualcuno con gli occhi più nitide di me riesco a trovare una garanzia da qualche parte ...

+0

Puoi suggerire una buona risorsa dove si può leggere su cosa significano ldc2_w e le altre istruzioni? –

+2

Specifiche JVM: http://java.sun.com/docs/books/jvms/ –

2

Gli ultimi 3 devono essere identici. Il letterale sul lato destro è già un doppio. La 'd' o 'D' è implicita quando si dispone di un valore decimale letterale.

Il primo è leggermente diverso in quanto 0 è un letterale int, che sarà allargato a un doppio. Non so se questo produce anche un codice byte diverso in questo caso o no; il risultato dovrebbe essere identico comunque.

+0

Grazie per la risposta, so che i risultati sono identici, voglio conoscere le differenze sotto il cofano. –

+0

Per "0.0", "0.0d" e "0.0D" non ci sono davvero differenze sotto il cofano. Sono tre modi per scrivere un doppio letterale, sono tutti esattamente equivalenti. – Jesper

-2

per Java Non so esattamente, in C questo può essere veramente pericoloso se si omette questo D alla fine poiché non cambierà i byte superiori, il che può avere l'effetto che nella propria variabile si trova il numero che in realtà non ha mettere in!

In Java ho avuto davvero un grosso problema con instatntiating BigDecimal - nuova BigDecimal (0) e la nuova BigDecimal (0L) non è la stessa cosa, si può sentire se si migra il codice da Java 1.4 per Java 1.5. Non so perché fossero negligenti, forse dovevano farlo in quel modo.

+1

La tua risposta non risponde alla domanda. Quello che sta succedendo in C non è rilevante e nemmeno la tua esperienza con BigDecimals. –

13

Per la prima:

double dummy = 0; 

l'intero letterale 0 viene convertito in una doppia con una conversione primitiva ampliamento , vedere 5.1.2 Widening Primitive Conversion nella specifica della lingua Java. Si noti che questo viene fatto interamente dal compilatore, non ha alcun impatto sul bytecode prodotto.

Per gli altri:

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

Questi tre sono esattamente gli stessi - 0.0, 0.0d e 0.0D sono solo tre modi diversi di scrivere un double letterale. Vedi 3.10.2 Floating-Point Literals nel JLS.