2015-01-16 12 views
5

użyć javy skopiować jeden długi całkowitą Y na krótki całkowitej x:Kiedy długa liczba całkowita jest rzucana na krótką, co się stało?

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

Wynik: Xy wynosi -25534.

Próbowałem dowiedzieć się, jak 40002 zostało rzucone do -25534, ale mi się nie udało. The 40002 odpowiada 1001 1100 0100 0010, a -25534 odpowiada 1110 0011 1011 1110. Czy ktokolwiek przyjaciel może mi powiedzieć, co się stało w tym procesie? Wielkie dzięki!

+4

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

Odpowiedz

9

Co masz zrobić poprzez odlewanie long do short jest zwężenie prymitywny konwersję, który jest objęty JLS, Section 5.1.3:

konwersja zwężenie liczba całkowita ze znakiem do integralnego typu T prosto odrzutów wszystkie oprócz n najniższych rzędów, gdzie n jest liczbą bitów używanych do reprezentacji typu T. Oprócz możliwej utraty informacji o wielkości wartości liczbowej może to spowodować, że znak uzyskanej wartości będzie różnił się od znak wartości wejściowej.

long wartość 40002 jest następujące: 64 bitów:

00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010 

Konwersja zachowuje tylko najmniej znaczące 16 bitów:

10011100 01000010 

To wiodący 1 jest interpretowany w notacji dopełniacza 2 do be -2^15, nie + 2^15. To wyjaśnia, dlaczego istnieje różnica 2^16, 65 536, w wartości long i wartości short.

+0

Podoba mi się to jako uzupełnienie mojej odpowiedzi. –

+4

@MattBall Podoba mi się * zamiast * Twojej odpowiedzi. Twoja opisuje wiele odejmowań i dodatków, które tak naprawdę się nie zdarzają. To opisuje, co się właściwie dzieje. – EJP

4

Integer overflow stało.

Krótki jest dwoma podpisanymi bajtami, co oznacza, że ​​Short.MAX_VALUE to 2 -1, co odpowiada 32 767. Wartości "większe" logicznie "zawijają się" w zakresie ujemnym.

W tym przypadku nadmiar wynosi 40002 - 2 = 7234
Short.MIN_VALUE jest -2 = -32.768
-32.768 + 7234 = -25.534

która jest numerem” zastanawiam się.

+0

Widzę .. 40,002 - 32 767 = 7,235 + -2,2768 = -25,533 .. nie wiem, gdzie to dodatkowe 1 poszło .. – Woodrow

+1

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

0

Dziękuję wszystkim wam. Według wszystkich odpowiedzi, I podsumować następująco: Wartość 40002 długo jest następujące: 64 bitów:

00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010 

Konwersja zachowuje tylko najmniej znaczące 16 bitów:

10011100 01000010 

When uwadze JVM 10011100 01000010 jako krótka liczba całkowita, zostanie obliczona w następujący sposób:

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

To jest to.

0

Zasadniczo, przejdzie on przez wartości, kiedy osiągniesz maksimum i dodasz 1, będzie to najniższa wartość, więc 32768 będzie -32768, kiedy osiągniesz 65536 (32768 * 2) być 0, a kiedy osiągniesz 98303 (32768 * 2 + 32767), będzie to 32767, jeśli dodasz, otrzymasz 98304 (32768 * 3) i znów będzie to -32768.

Tak więc 40002 (który jest wyższy niż 32768, ale mniejszy niż 32768 * 2), z pewnością będzie liczbą ujemną po konwersji na krótki.