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?
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?
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.
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. –
@ 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. –
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).
@ 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. –
buona domanda +1 da parte mia –