2014-07-16 10 views
62

In Java, quando si dichiaraJava Primitives calcolo gamma

short number=1024*1024*1024; 

darà compilazione errore di tempo, ma

short number=1024 * 1024 * 1024 * 1024; 

compila bene. Perché succede?

+0

@ Raedwald, Erwin, Ivan, Carlos La mia domanda è diverso da quello della domanda che mentioned.here la questione non è solo di valutazione del tempo di esecuzione letterale e del numero, ma la sua riferisce alla gamma di breve, a domanda di cui sopra, anche sebbene nessuna espressione sia letterale, la prima dà errore, la domanda è: perché questo comportamento si verifica nella compilazione? in ogni modo grazie, ora sono soddisfatto delle risposte sottostanti. –

+0

buona domanda +1 da parte mia –

risposta

72

Il compilatore, in questo caso, valuta il calcolo (poiché contiene solo costanti) e tenta di assegnare il risultato alla variabile. Questo calcolo viene eseguito con il tipo int e convertito solo in short sull'assegnazione, se possibile.

Nel tuo caso, il primo calcolo è troppo grande per rientrare in un short (1073741824). Il secondo supererà lo int e finirà in un intervallo supportato da short (0). Quindi l'incarico funziona in quel caso.

Attenzione, probabilmente non vorrai mai fare affidamento su queste cose nel codice.

+10

Possiamo vedere questo anche cambiando uno di loro in '1024L', nel qual caso il calcolo viene eseguito come' long' e l'overflow non si verifica, causando di nuovo un errore di compilazione. –

+1

@ user2169777: - Una perdita di precisione significa che si stanno perdendo informazioni sul valore dato. (* Il tipo di dati brevi è un intero di complemento a due con segno a 16 bit. Ha un valore minimo di -32.768 e un valore massimo di 32.767 (incluso). *) Nel primo caso il raggio del corto è attraversato (1073741824) e quindi stai perdendo le informazioni. Quindi stai ricevendo l'errore. –

11

Sei di fronte al problema in quanto il tuo numero è wrapping around. Nel primo caso non si avvolge e quindi trabocca l'intervallo di breve. Ma nel secondo caso si avvolge dopo il calcolo e quindi arriva nell'intervallo di breve e quindi non si ha l'errore di compilazione.

una perdita di precisione significa che si stanno perdendo le informazioni del valore dato. (La breve tipo di dati è un 16 bit firmato intero complemento a due. Ha un valore minimo di 32.768 e un valore massimo di 32.767 (incluso)) Nel primo caso il raggio del corto è attraversato (1073741824) e quindi stai perdendo le informazioni.

Una conversione restringimento di un intero con segno a un tipo integrale T scarta semplicemente tutti ma i bit di ordine n bassi, dove n è il numero di bit usato per rappresentare tipo T.

EDIT: -

Da JLS §3.10.1 (molto correttamente indicato nella this domanda simile)

01.235.164,106174 millions

È un errore di compilazione se un decimale letterale di tipo int è maggiore di 2147483648 (2), o se il decimale letterale 2147483648 appare altrove che come operando dell'operatore unario (§15.15.4).