unsigned bytes in Java

Arbeitet man in Java mit dem Datentyp byte, so stellt man ein merkwürdiges Verhalten fest. Liest man nun beispielsweise eine Datei als byte[]-Array ein und lässt sich die eingelesenen Bytes anzeigen, so findet man neben typischen Bytes wie 0x20 (Leerzeichen) oder 0x41 (”A“) auch plötzlich Werte wie 0xffffffc4 (Ä) und 0xffffff87 (). Das sind Werte, die doch gar nicht in ein Byte passen?!

Die Ursache ist, dass Java keine vorzeichenlosen Datentypen kennt (also auch keine "unsigned" byte) und daher alle Bytes mit einem Wert über 0x7f als negative Bytes interpretiert. Da Java nun auch intern die Datentypen byte, short und int in vier Bytes speichert, wird das “Vorzeichen” gemäß binärer Arithmetik nach vorne verlängert. So kommen die überlangen Bytes zustande.

Zusätzlich beschwert sich Java aufgrund dieser Tatsache auch, wenn man Werte größer als 0x7f in einem byte speichern möchte. Das erzeugt den Fehler (keine Warnung, was vielleicht angebrachter wäre): possible loss of precision! Umgehen kann man diese Fehlermeldung nur, indem man den Wert explizit auf byte castet.

jGuru empfiehlt sogar, auf die Verwendung der kleinen Datentypen zu verzichten und gleich mit int zu arbeiten, wenn man “vorzeichenlos” arbeiten möchte. Da der Speicherverbrauch der gleiche ist, kann man die Problematik damit elegant umgehen — wenn man nicht gezwungen ist, mit byte zu arbeiten ;)

6 Reaktionen zu “unsigned bytes in Java”

  1. #1
    kriki GERMANY Windows XP Mozilla Firefox 2.0.0.1 schreibt:

    Ich liebe es, wenn du mir solche Worte sagst :-)

  2. #2
    Christian GERMANY Windows XP Mozilla Firefox 2.0.0.1 schreibt:

    Öhm, ja. Ähm, wie bitte?

  3. #3
    Sebi GERMANY Windows XP Mozilla Firefox 2.0.0.1 schreibt:

    Vermutlich hat kriki deinen Post genauso nicht verstanden wie du seinen nicht. Ich versteh übrigens euch beide nicht. :)

  4. #4
    kriki GERMANY Windows XP Mozilla Firefox 2.0.0.2 schreibt:

    Ich wollte deinen durchaus wohl auch sinnvollen Post durch eine belustigende Aussage unterstreichen, weil ich davon halt nichts bis überhaupt nichts verstanden habe. Und nach soviel Fachvokabular fand ich den informatischen Gehalt einfach so schon ästhetisch: wie, wenn man eine fremde Sprache hört oder anschaut (lesen würde glaube ich Verstehen voraussetzen) und sie einfach so interessant findet.

  5. #5
    Christian GERMANY Windows 2000 Mozilla Firefox 2.0.0.2 schreibt:

    OK.

    Da dieses Thema auch inhaltlich wohl nur Leute interessiert, die sich mit Java intensiver beschäftigen, habe ich hier darauf verzichtet, wie üblich für jedermann zu erklären. Ich hoffe, dass meine Stammleser mir das verzeihen, aber ebenso denke ich halt, dass Leute, die genau diese Information suchen, sich über diesen Artikel freuen.

    Später (wenn ich dazu komme) gibt’s auch wieder leichtere Kost. Versprochen. :o)

  6. #6
    Christian GERMANY Windows 2000 Mozilla Firefox 2.0.0.3 schreibt:

    Für die Interessierten habe ich noch einen Link gefunden, der auch was dazu sagt, warum es diese Datentypen in Java nicht gibt:

    http://darksleep.com/player/Ja.....Types.html

Einen Kommentar abgeben


This blog uses DigoWatchWP an anti-fraud plugin for Wordpress.