2015-01-16 5 views
5

Io uso java copiare un intero lungo y per un breve intero x:Quando un intero lungo viene inserito in un breve, cosa è successo?

long y = 40002; 
short x = (short) y; 
System.out.println("x now equals " + x); 

Il risultato è: X equivale ora -25.534.

Ho cercato di capire come 40002 è stato inserito in -25534, ma non sono riuscito. Il 40002 corrisponde a 1001 1100 0100 0010, il -25534 corrisponde a 1110 0011 1011 1110. Può qualche amico dirmi cosa è successo in questo processo? Molte grazie!

+4

'2^16' -' 40002' = '25534' :) –

risposta

9

Ciò che avete fatto per lanciare un long ad un short è un restringimento di conversione primitiva, che è coperto dal JLS, Section 5.1.3:

una conversione restringimento di un numero intero con segno a un tipo integrale T semplicemente rigetti in mare tutti tranne i bit di ordine inferiore, dove n è il numero di bit utilizzati per rappresentare il tipo T. Oltre a una possibile perdita di informazioni sulla grandezza del valore numerico, ciò potrebbe causare la differenza tra il segno del valore risultante segno del valore di input.

Il long valore 40002 è il seguente 64 bit:

00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010 

La conversione conserva solo i 16 bit meno significativi:

10011100 01000010 

Tale porta 1 viene interpretato in notazione complemento 2 a essere -2^15, non + 2^15. Questo spiega perché c'è una differenza di 2^16, di 65.536, nel valore long e nel valore short.

+0

Mi piace come complemento alla mia risposta. –

+4

@MattBall Mi piace * invece di * la tua risposta. La tua descrive molte sottrazioni e aggiunte che in realtà non accadono. Questo descrive cosa succede realmente. – EJP

4

Integer overflow successo.

Un corto è due byte firmati, il che significa che Short.MAX_VALUE è 2 -1, che è 32.767. I valori "maggiori" logicamente "avvolgono" nell'intervallo negativo.

In questo caso l'importo eccedente è 40.002 - 2 = 7234
Short.MIN_VALUE è -2 = -32.768
-32.768 + 7234 = -25.534

che è il numero che si' Re chiedendo su.

+0

Vedo .. 40,002 - 32,767 = 7,235 + -32,768 = -25,533 .. non so dove sia andato 1 in più .. – Woodrow

+1

@Woodrow è 40,002 - 32,76 ** 8 ** –

0

Grazie a tutti voi ragazzi. Secondo tutte le risposte, riassumo come segue: La lunga valore di 40002 è il seguente 64 bit:

00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010 

La conversione conserva solo i 16 bit meno significativi:

10011100 01000010 

Quando JVM per quanto riguarda 10011100 01000010 come un intero breve, si calcola così:

-2^15 + 00011100 01000010 = -32768 + 7234 = -25534 

questo lo è.

0

Fondamentalmente, passerà attraverso i valori, quando raggiungi il massimo e aggiungi 1 sarà il valore più basso, quindi 32768 sarà -32768, quando raggiungi 65536 (32768 * 2) sta andando essere 0 e quando si raggiunge 98303 (32768 * 2 + 32767) sarà 32767, se ne aggiungi uno si arriva a 98304 (32768 * 3) e sarà di nuovo -32768.

Quindi 40002 (che è superiore a 32768 ma inferiore a 32768 * 2) sarà chiaramente un numero negativo quando convertito in breve.