2012-05-14 15 views
6

Die Frage ist:Java-Betreiber interessantes Problem

Warum in diesem Fall bekomme ich Kompilierungsfehler in Java?

byte x = 0; 
x = 128; 

Aber das ist legal:

x+= 999l; 

Ich benutze Eclipse, jdk 7.

Danke

+0

Was genau versuchen Sie zu fragen, haben die jeweiligen Codeblöcke neben einer Variablen x nichts gemeinsam? – sjakubowski

+1

Er bedeutet, dass x ist auch Byte im zweiten Fall –

Antwort

2

In Ihrer erste ist:

byte x = 0; 
x = 128; 

Ein Byte ist ein vorzeichenbehafteter Integraltyp mit 8 Bit Breite und kann den Bereich von -128 bis +127 darstellen.

x = 128 bedeutet „zuweisen x zu 128“, und standardmäßig 128 ist vom Typ int, so dass Sie versuchen, eine int zu byte zuzuordnen, die Possible loss of precision Fehler verursachen würde, weil int breiter als byte ist. Damit dies funktioniert, müssen Sie explizit den Wert 128 eingeben.

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

Für Ihr zweites Beispiel Wert x Zugabe ist in Ordnung, aber Sie überlaufen nur die Werte.

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

byte unterzeichnet ist und nur einen Maximalwert von 127 und halten Mindestwert von -128, deshalb gibt der erste Fall einen Kompilierungsfehler.

Der zweite Fall kompiliert da und Wert, den Sie zu einem ‚Byte‘ hinzufügen um Wraps, feststellen, dass 999 % 128 = 103, die im gültigen Bereich eines ‚byte‘

+0

Es spielt keine Rolle, welche Nummer er hinzugefügt, Addition wird nie versäumen zu kompilieren; Es wird einfach überlaufen - im Gegensatz zu dem Versuch, eine Konstante für die Kompilierung außerhalb des Bereichs zuzuweisen. –

+0

@MarkoTopolnik True, danke –

+0

Es ist interessant, aber warum? Im Compiler kann man sehen, dass es überläuft und kann es verbieten, aber es tut es nicht .. –

0

In dieser ersten Aussage x = 128, da der Byte-Bereich 0-127 in Java ist, erfordert es eine explizite Umwandlung und damit die Übersetzungsfehler. Im zweiten Fall läuft es über und wird in -25 konvertiert, was im Byte-Bereich liegt.