2012-03-22 9 views
6

Próbuję dodać dwie wartości w tablicy bajtów. To jest mój kod:Dodawanie bajtów z odlewaniem typów, Java

byte[] ars = {3,6,9,2,4}; 
ars[0] = (byte)ars[0] + (byte)ars[4]; 
System.out.println(ars[0]); 

otrzymuję ten błąd na kompilacji:

Main.java:9: possible loss of precision 
found : int 
required: byte 
    ars[0] = (byte)ars[0] + (byte)ars[4]; 
         ^
1 error 

Każda pomoc jest, jak zawsze, bardzo cenione.

Odpowiedz

10

blisko, ale trochę off.

ars[0] = (byte)(ars[0] + ars[4]); 

pamiętać ars[0] i ars[4] już bajtów, więc nie ma potrzeby, aby rzucić je do bajtów.

Zamiast tego rzuć wynik sumowania do bajtu.

+3

Zdarza się, ponieważ 100 (bajt) + 100 (inny bajt) to 200, który nie jest bajtem (w Javie, gdzie bajty są z -128 do 127). Wyraźna obsada mówi, że można wyrzucić "przelew". – Thilo

2

Proszę zastąpić tę linię z poniższym

ars[0] = (byte)(ars[0]+ars[4]); 
2
ars[0] = (byte)(ars[0] + ars[4]); 
8

W Javie sumy dwóch byte S jest int. Dzieje się tak, ponieważ na przykład dwie liczby poniżej 127 mogą dodać do liczby powyżej 127, a domyślnie Java używa int s dla prawie wszystkich liczb.

Aby zaspokoić kompilator, wymienić danej linii z tego:

ars[0] = (byte)(ars[0] + ars[4]); 
2
byte[] ars = {3,6,9,2,4}; 
     ars[0] = (byte) (ars[0] + ars[4]); 
     System.out.println(ars[0]); 

To zadziała, spróbuj to

4
public static void main(String args[]){ 
    byte[] ars = {3,6,9,2,4}; 
    ars[0] = (byte)(ars[0] + ars[4]); 
    System.out.println(ars[0]); 
} 

to dzieje się dlatego, że Java automatycznie przekształca wyrażenia które używają bajtów i zmiennych krótkich do int ... ma to na celu uniknięcie potencjalnego ryzyka przepełnienia ... w wyniku czego nawet jeśli wynik może być w zakresie bajtów, java promuje typ wyrażenia do int

3

I krzywka całej tej kwestii, natomiast tył, i zbiera wszystkie wyniki tutaj: http://downwithjava.wordpress.com/2012/11/01/explanation-to-teaser-2/

Wszyscy wiemy bajtów zamieniony na wskazówki podczas operacji arytmetycznej. Ale dlaczego tak się dzieje? Ponieważ JVM nie ma instrukcji arytmetycznych zdefiniowanych dla bajtów. zmienne typu bajtowego muszą być dodane przez pierwsze "numeryczne promowanie" zmiennych typu "int", a następnie dodanie. Dlaczego w JVM nie ma instrukcji arytmetycznych dla typu bajtowego? Specyfikacja JVM wyraźnie mówi:

Maszyna wirtualna Java zapewnia najbardziej bezpośrednią obsługę danych typu int. Jest to częściowo w oczekiwaniu na wydajne implementacje stosów operandów maszyny wirtualnej Java i lokalnych tablic zmiennych. Jest również motywowana przez częstotliwość danych int w typowych programach. Inne typy integralne mają mniej bezpośrednie wsparcie. Na przykład nie ma bajtu, znaków ani krótkich wersji sklepu, nie ładuj ani nie dodawaj instrukcji.

+2

Odpowiedzi dotyczące wyłącznie linków są generalnie mile widziane. – David

+0

Witamy w StackOverflow. Jak sugeruje David, zwykle najlepiej jest, gdy odpowiedzi są przynajmniej w pewnym stopniu niezależne.Wystarczy podać krótkie podsumowanie tutaj i podać podstawowe produkty na wynos. – phant0m

+0

@DavidStratton edytował odpowiedź. –

Powiązane problemy