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
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
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.
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‘
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. –
@MarkoTopolnik True, danke –
Es ist interessant, aber warum? Im Compiler kann man sehen, dass es überläuft und kann es verbieten, aber es tut es nicht .. –
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.
Byte hat einen Bereich von -128 bis 127. Dies x + = 999l; funktioniert, weil es sich um einen Verbundzuweisungsoperator handelt. Schau mal hier possible same or alike question.
Was genau versuchen Sie zu fragen, haben die jeweiligen Codeblöcke neben einer Variablen x nichts gemeinsam? – sjakubowski
Er bedeutet, dass x ist auch Byte im zweiten Fall –