byte a =65, byte b=67 wenn ich nun mache: a=a+b, kommt die Fehlermeldung, dass ich kein int to byte konvertieren könne. Aber a und b sind doch bytes?
3 Antworten
@Regex typecast a = (byte) (a + b); funktioniert zwar, aber...:
Damit verwirfst du aber das höherwertige Byte. Da wie @Heizfeld bereits erwähnte, das Ergebnis 132 ist, passt es nicht mehr in eine byte-variable.
Das verstümmelte Ergebnis passt zwar in die byte-Variable a ist jedoch mathematisch falsch = -124.
binär ist -124 = 132 = 1000 0100
Keine Ahnung, was Du als Ergenis erwartest, ein im "Blindflug" reduziertes Lowbyte ist nur selten eine gute Sache und kann ungeahnte Spätfolgen haben.
Deklariere deine Variablen besser so, das die Ergebnisse hineinpassen.
einen Typecast kannst Du ausführen wenn du ihn nötig hast.
public class Main {
public static void main(String[] args) {
int a = 65;
int b = 67;
a = a + b;
System.out.println("ohne cast :" +a);
System.out.println("mit cast :" + (byte)a); // erst hier, wo ich ihn will, der Typecast
}
}
...ist aber auch kein Beinbruch , wenn man richtig saubere Binäroperationen möchte "entfernt" man auch bei einem Integer einfach das Höherwertige und bekommt auch in Java das Vorzeichenlose Ergebnis ganz ohne blindes "zerhacken" von variablen.
egal ob C# oder Javas oder sonstwas, ein narrow cast ist nie eine gute Sache.
Ich würde es besser mit einem sauberen and 0x00FF erledigen, dann ist absolut klar was ich will.
public class Main {
public static void main(String[] args) {
int a = 65;
int b = 67;
a = a + b;
System.out.println("vorzeichnloses pseudo;p byte :" + (a & 0xFF));
}
}
PS: Ich habe gesehen das Du noch mehr fragen zu den Basics gestellt hast.
Auf https://www.w3schools.com/java/java_type_casting.asp mehr dazu. (Die haben einen Onlinecompiler, also kannst Du im "Tryit" direkt mit Deinen Ideen herumspielen)
Die einzelnen Werte sind zwar Bytes, doch für die Berechnung werden sie implizit zu Integer konvertiert, woraufhin auch die Summe einen Integertyp ergibt. Daher ist nochmal ein expliziter Typecast notwendig.
a = (byte) (a + b);
In Java ist ein expliziter Typecast nicht notwendig:
15.26.2. Compound Assignment Operators
A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.
Hoppla, falsche Baustelle -- ich habe automatisch „a += b“ gelesen.
Hallo,
der Datentyp Byte kann Werte von 0..127 darstellen. Wenn du die beiden Byte 65+67 zusammenrechnest kommt aber 132 raus und das Ergebnis muss in integer oder word umgewandelt werden
MFG
Harry
Der Datentyp Byte kann 256 verschiedene Werte speichern (8 bit) und nicht nur 128 (7 bit)
Normalerweise gibt man den Bereich mit 0..256 an. Wenn er vorzeichenbehaftet ist, dann zumeist -128 .. 127.
0 .. 127 ist jedenfalls falsch!
Du solltest regex9 auch markieren, damit er das mitbekommt ;)
Aber dem, was Du schreibst, stimme ich zu: Ein unbedachtes Cast kann gefährlich sein.
Wobei das aber nicht überall gilt, z.B. geht bei C# ein Byte von 0 bis 255 und es gibt noch ein sbyte mit Vorzeichen.
Ich frage mich aber auch, warum Java hier unbedingt ein Vorzeichen erzwingt...