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
    
  }
}

Palladin007  10.10.2021, 09:35

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...

0
Erzesel  10.10.2021, 09:53
@Palladin007

...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)); 
   
 }
}
0
Von PeterKremsner und einem weiteren Experten bestätigt

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);

wunschname0302  10.10.2021, 05:59

Genau genommen werden die Operanden zu int konvertiert.

2
ralphdieter  10.10.2021, 16:38

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.
0

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


gfntom  10.10.2021, 08:35

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!

2
heizfeld  10.10.2021, 08:38
@gfntom

Stimmt natürlich, wie kam ich jetzt bloss da drauf? Ich hatte irgendwie eine 1Byte Integer Variable im Kopf.

0