Warum kann ich nicht hinzufügen, zwei bytes und bekomme ein int und ich kann hinzufügen, die beiden letzten bytes Holen Sie sich ein byte?
public class Java{
public static void main(String[] args){
final byte x = 1;
final byte y = 2;
byte z = x + y;//ok
System.out.println(z);
byte a = 1;
byte b = 2;
byte c = a + b; //Compiler error
System.out.println(c);
}
}
Wenn das Ergebnis eines Ausdrucks mit etwas int-Größe oder kleiner ist immer ein int, auch wenn die Summe von zwei Byte passen in ein byte.
Warum passiert es, wenn wir addieren die beiden letzten bytes passen in ein byte?
Es gibt keine compiler-Fehler.
InformationsquelleAutor Joe | 2012-10-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Von den JLS 5.2 Zuordnung Konvertierung
Kurz der Wert des Ausdrucks (die zur Kompilierzeit bekannt ist, denn es ist ein konstanter Ausdruck) ist darstellbar in der Art der variable, der byte.
Betrachten Sie Ihren Ausdruck
Also als Summe passt in byte es keinen Anlass zu einem Kompilierungsfehler.
Nun, wenn Sie
Dank Zusätzlichen in der Zusammenfassung-und detail-Beschreibung
Aber die Hinzufügung von zwei int-Typen erlaubt ist. Auch bei int Typen -, überlauf-kann passieren, richtig? Warum Verhalten ist unterschiedlich bei int und byte-Typen?
Auch, "compile-time konstanter Ausdruck ist ein Ausdruck [...] komponiert verwenden Sie nur die folgenden: • Literale der primitiven Art und Literale des Typs
String
. [...] • Die Additiven Operatoren+
und-
. [...] • Einfache Namen, die sich auf Konstante Variablen." Wo "Eine variable des primitiven Typs oder TypString
, das istfinal
und initialisiert mit a compile-time constant expression" Konstante variable.".InformationsquelleAutor Amit Deshpande
Hier, da
x
undy
deklariert sindfinal
also der Wert des Ausdrucks auf derRHS
zur Kompilierzeit bekannt ist, die ist fest auf(1 + 2 = 3)
und kann nicht variieren. Also, Sie brauchen nicht zu Typumwandlung explizitIn der Erwägung, dass in diesem Fall der Wert
a
undb
sind nicht final deklariert. Also, der Wert des Ausdrucks ist nicht bekannt, zur Kompilierzeit, sondern zur Laufzeit ausgewertet. Also, müssen Sie einen expliziten cast.Aber auch in den 1. code, wenn der Wert des
a + b
kommt heraus, um außerhalb der Reichweite-128 to 127
es wird das kompilieren fehlschlagen.diesem Fall, es würde scheitern. Weil 240 untergebracht werden können, in byte.
InformationsquelleAutor Rohit Jain