2012-05-14 15 views
6

Pytanie brzmi:Operatory Java interesujący problem

Dlaczego w tym przypadku wystąpił błąd kompilacji w Javie?

byte x = 0; 
x = 128; 

Ale to jest legalne:

x+= 999l; 

używam Eclipse, jdk 7.

Dziękuję

+0

Co dokładnie próbujesz zapytać, odpowiednie bloki kodu nie mają nic wspólnego oprócz posiadania zmiennej x? – sjakubowski

+1

Oznacza to, że x jest również bajtem w drugim przypadku. –

Odpowiedz

2

w pierwszej jedno:

byte x = 0; 
x = 128; 

Bajt to oznaczenie typu całkowanego o szerokości 8 bitów i może wyrażać zakres od -128 do +127.

x = 128 oznacza „przypisać x do 128” i domyślnie 128 jest typu int, więc starasz przypisała int do byte co spowodowałoby Possible loss of precision błędy, ponieważ int jest szerszy niż byte. Aby to działało, musiałbyś jawnie rzucić wartość 128.

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

Za drugie przykład dodanie wartości do x jest w porządku, ale po prostu przelewać wartości.

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

byte jest podpisana i można tylko posiadać maksymalną wartość 127 oraz minimalna wartość -128, dlatego w pierwszym przypadku występuje błąd kompilacji.

Drugi przypadek kompiluje bo i wartość dodać do „bajt” owija wokół zauważyć, że 999 % 128 = 103, który znajduje się w ważnej zasięgu „bajt”

+0

Nie ma znaczenia, który numer dodał, dodawanie nigdy nie zawiedzie; po prostu przepełni się - w przeciwieństwie do próby przypisania stałej czasu kompilacji poza zasięgiem. –

+0

@MarkoTopolnik To prawda, dzięki –

+0

To jest interesujące, ale dlaczego? W kompilatorze można zobaczyć, że jest on przepełniony i może go zabronić, ale nie robi tego. –

0

W tym pierwszym oświadczeniu x = 128, ponieważ zakres bajt jest 0-127 w Javie wymaga wyraźnej obsadę i stąd ten błąd kompilacji. W drugim przypadku przepełnia się i konwertuje na -25, który znajduje się w zakresie bajtów.