2009-11-02 11 views
16

Zasady promocji to "kiedy operandy są różnych typów, automatyczna numeryczna promocja binarna ma miejsce, gdy mniejszy typ operandu jest konwertowany na większy". Ale operandy są tego samego typu, na przykład:Promocja w Javie?

byte=byte+byte // Compile time error... found int.. 

Dlaczego tak jest?

+0

Możliwy duplikat [Dlaczego nie mogę dodać dwa bajty i uzyskać int i mogę dodać dwa ostatnie bajty, aby uzyskać bajt?] (http://stackoverflow.com/questions/13100019/why-can-not-i-add-two-bytes-and-get-an-int-and-i-can- add-two-final-bytes-get-ab) –

Odpowiedz

35

Nie ma operatora + dla byte. Zamiast tego, oba operandy są promowane na int, więc masz

byte = byte + byte 
... becomes (widening to find + operator) ... 
byte = int + int 
... becomes (result of + operator) ... 
byte = int 

... co wtedy nie działa, ponieważ nie ma niejawna konwersja z int do byte. Trzeba rzucić:

byte a = 1; 
byte b = 2; 

byte c = (byte) (a + b); 

Oto rzeczywiste zasady promocji numerycznej, z section 5.6.2 of the JLS: z czego


Kiedy operator stosuje binarnego promocji numerycznej parę argumentów, każdy musi oznaczać wartość, która może być przekształcana na typ numeryczny, stosuje się następujące reguły, w kolejności, używając konwersji rozszerzającej (§5.1.2) do konwersji argumentów, jeśli to konieczne:

  • Jeśli którykolwiek z argumentów jest typu referencyjnego, wykonywana jest konwersja rozpakowywania (§5.1.8). Następnie:
  • Jeśli jeden z argumentów jest typu double, drugi jest konwertowany na double.
  • W przeciwnym wypadku, jeśli jeden z argumentów jest typu zmiennoprzecinkowego, drugi jest konwertowany na zmienny.
  • W przeciwnym wypadku, jeśli jeden z operandów ma typ long, drugi jest konwertowany na long.
  • W przeciwnym razie oba operandy zostaną przekonwertowane na typ int.
+4

dzięki Jon to jest to, czego się spodziewałem. Ale jedno, o co muszę zapytać, to dlaczego nie ma operatora + dla bajtu? – i2ijeya

14

Dostarczono poprawną odpowiedź dotyczącą automatycznej promocji na "int".

Jest jeszcze jedna uwaga na ten temat - operatory przypisania złożonego zachowują się tak, jak mają niejawny typ liter. Przykład:

byte b1 = 1; 
byte b2 = 2; 
b1 = b1 + b2; // compilation fails 
b1 += b2; // compilation successful 
0

Z this SO question i przede odpowiedzi ze względu na + operatora arytmetyczna oba argumenty są przekształcane do typu int.

byte b1 = 1; 
byte b2 = 2; 
byte b3 = b1 + b2; // compile time error 

W powyższym kodzie wartość b1 i b2 zostanie rozwiązany w czasie wykonywania, więc kompilator konwertuje zarówno int przed rozwiązywaniu wartość.

Ale jeśli weźmiemy pod uwagę następujący kod,

final byte b1 = 1; 
final byte b2 = 2; 
int b3 = b1 + b2; // constant expression, value resolved at compile time 

b1 i b2 są zmienne i wartości końcowe zostanie rozwiązany w czasie kompilacji więc kompilacja nie zawiedzie.

0

chciałbym mówić o promocji w ogólnym

Java można ocenić wyrażenia tylko arytmetycznych, w których typy argumentów mają identyczne

Na przykład, w wyrażeniu zawierająca wartości int i double , wartości int są promowane do podwójnych wartości do użycia w wyrażeniu.

w innym słowem

double someVar = 1/2;// someVar = 0 

ale

double someVar = (double)1/2;// someVar = 0.5 

dlaczego?

  • używamy (podwójne) cast operator stworzyć temporary zmiennoprzecinkową kopię swojego argumentu "1" (to się nazywa explicit conversion)
  • Obliczenia obecnie składa się z wartości zmiennoprzecinkowych (tymczasowy podwójna kopia 1) podzielona przez liczbę całkowitą 2
  • według powyższego zestawienia, Jawa wykonuje operacje zwane promotion (lub pośredniego konwersji), tak int values promuje do double values do stosowania in wyrażenie => liczbę całkowitą 2 jest podnoszony do podwojenia
  • wyrazem stała double someVar = 1.0/2.0; // someVar= 0.5

nadzieją jest to pomocne, nawet jeśli jest z rdzenia pytanie