2012-05-14 15 views
6

La domanda è:Numero di operatori Java interessante

Perché in questo caso ottengo errore di compilazione in Java?

byte x = 0; 
x = 128; 

Ma questo è legale:

x+= 999l; 

Io uso Eclipse, JDK 7.

Thank You

+0

Che cosa stai cercando di fare esattamente, i rispettivi blocchi di codice non hanno nulla in comune oltre ad avere una variabile x? – sjakubowski

+1

Vuol dire che x è anche un byte nel secondo caso –

risposta

2

Nella tua prima:

byte x = 0; 
x = 128; 

Un byte è un tipo integrale firmato, largo 8 bit e può esprimere l'intervallo di -128 a +127.

x = 128 significa "assegnare x a 128", e per impostazione predefinita, 128 è di tipo int, quindi si sta cercando di assegnare un int a byte che causerebbe Possible loss of precision errori, perché int è più ampia rispetto byte. Per farlo funzionare, devi espressamente assegnare il valore di 128.

byte x = 0; 
x = (byte)128; // x is now -128. 

Per il vostro secondo esempio, l'aggiunta di valori a x va bene, ma basta overflow del valori.

byte x = 0; 
x += 999L; // don't really need the long qualifier here 
// x is now -25. 
4

byte è firmato e può contenere solo un valore massimo di 127 e un valore minimo di -128, ecco perché il primo caso ti dà un errore di compilazione.

Il secondo caso compila perché e il valore aggiunto a un 'byte' avvolge, si noti che 999 % 128 = 103, che è nel campo valido di un 'byte'

+0

Non importa quale numero abbia aggiunto, l'aggiunta non fallirà mai nella compilazione; sarà solo un overflow, al contrario del tentativo di assegnare una costante in tempo di compilazione fuori range. –

+0

@MarkoTopolnik Vero, grazie –

+0

È interessante, ma perché? Nel compilatore si può vedere che esso trabocca e può vietarlo ma non lo fa .. –

0

In questa prima affermazione x = 128, dal momento che l'intervallo di byte è 0-127 in Java richiede un cast esplicito e quindi l'errore di compilazione. Nel secondo caso, trabocca e viene convertito in -25, che si trova nell'intervallo di byte.