Erste Schritte Rechnenoperationen mit byte, short und char

  • Themenstarter Themenstarter Rechenwerk
  • Beginndatum Beginndatum
R

Rechenwerk

Gast
Hallo,

ich frische gerade meine Java-Kenntnisse wieder etwas auf und habe zum Thema Datentypen gleich eine Frage. Bei der Initialisierung von byte, short und char wird ja ein Integer Literal angenommen sofern er in den Wertebereich passt. Soweit so gut, es bleibt aber ein Integer soweit ich verstanden haben, deswegen kann man auch nicht schreiben:

Java:
byte a = 42;
byte b = 23;
byte c = a + b; // Fehler, da zwei Int unbekannter Größe nicht in ein byte Typ passen.

Aber warum geht dann dies hier nicht?
Java:
byte a = 42;
byte b = 23;
byte c = (byte)a +(byte)b; // Fehler, kann int nicht in byte konvertieren

Die Lösung ist ja:
Java:
byte a = 42;
byte b = 23;
byte c = (byte)(a + b);

Hat die Addition Vorrang vor dem Casten?

Warum wird nicht bei der Initialisierung von byte, short und char der Typ gleich implizit gecastet?
 
> byte c = a + b;
und
> byte c = (byte)a +(byte)b;
sind absolut dasselbe,
mit unterschiedlichen Kommentaren verwässerst du das etwas

wichtig ist die Erkenntnis, das gerechnet wird in int, daran kannst du nix machen (außer auf höheres a la long, float, double zu wechseln)
und vor allem als Fehlerquelle hier, dass das Endergebnis von int auf byte gecastet werden muss

> byte c = (byte)a +(byte)b;
macht dies schlicht nicht, castet nur die beiden Summanden vor der Addition, bedeutungslos da sowieso schon byte

> byte c = (byte)(a + b);
hier wird das Ergebnis abschließend gecastet

------

> Warum wird nicht bei der Initialisierung von byte, short und char der Typ gleich implizit gecastet?

als Hinweis an Schlafmützen die daran nicht denken würden 😉
 
Zuletzt bearbeitet von einem Moderator:
Danke für die Erklärung, ein Problem habe ich noch.

> b
> byte c = (byte)a +(byte)b;
macht dies schlicht nicht, castet nur die beiden Summanden vor der Addition, bedeutungslos da sowieso schon byte>

Warum erhalte ich dann eine Fehlermeldung wie diese, wenn a und b doch schon vom Typ byte sind?
Type mismatch: cannot convert from int to byte
 
> byte c = a + b;
bedeutet mehr oder weniger:
> int x = a;
> int y = b;
> int z = x+y;
> c = z;

die Fehlermeldung kommt in der letzten Zeile, was a und b für einen Typ haben ist dabei ziemlich egal

> byte c = (byte)a +(byte)b;
ist wie gesagt kein echter Unterschied, vielleicht so
> byte v = (byte) a;
> byte w = (byte) b;
> int x = v;
> int y = w;
> int z = x+y;
> c = z;

'cannot convert from int to byte' hat nichts mit deinen Casts zu tun, sondern mit dem fehlenden Cast zum Ende,
kommt ja bei 'byte c = a + b;' genauso
 
Zuletzt bearbeitet von einem Moderator:
Ok, danke soweit verstanden. Ist dann byte also mehr ein künstlicher Typ und empfiehlt es sich eher mit int zu arbeiten und zum Schluß auf byte etc. zu casten damit man nicht durch einander kommt?
 
Noch eine Anmerkung meinerseits: Da ich auch aus der C/C++ Welt kam hatte ich Probleme beim wandeln von Strings in byte[] und vice versa da in Java Strings UTF-8 sind und bytes signed sind!

Für Zeichen (>128 und <= 255) ist in C (char == byte) und in Java nicht!

Wenn du beispielsweise einen byte mit Wert 129 in einen char wandelts sieht der char folgendermaßen aus 0uFF81 und das ergibt irgendein chinesisches Zeichen im String! Achte also bei solchen Konvertierungen darauf den char mit 0u00FF zu maskieren!
 
> und empfiehlt es sich eher mit int zu arbeiten

in der Tat ein (halb gezwungen) guter Gedanke, z.B. liefert auch die read()-Methode von InputStream, die ein Byte lesen soll, einen int zurück,
(vielleicht allerdings aufgrund dessen was kappesf erwähnt)

genaue Regeln kann man aber kaum aufstellen, sieh dir an was alles machmar ist und entscheide deine Vorgehensweise,

dass nur mit int alles wohl minimal performanter geht ist praktisch nicht nachweisbar und fachlich irrelevant
 

Zurück
Oben