java unsigned?

Kusarr

Software-Overclocker(in)
hab Problem bei java:

soll mit ner 16-bit variablen rechnen, ergo unsigned short. Wertebereich: 0 bis 65535.
Aber iwie klappt das in java nich so. unsigned gibts ja scheinbar nicht.

Wie kann ich das umsetzen?
 
Du könntest chars benutzen, das ist ein 16bit unsigned Datentyp, und man kann damit auch ganz normal rechnen, auch wenns natürlich nicht so gedacht ist.
Abgesehen davon gibt es in Java AFAIK aber keine unsigned Datentypen.
 
Das mit dem char ist mal ganz pfui bäh. Besser wäre es den nächst größeren Datentyp (int) zu nehmen und nur die unteren 16 Bit zu verwenden.
 
Ob signed oder nicht...du rechnest doch mit 16 bit. Es wird nur anders dargestellt.

Beispiel:
0 dec unsigned = 0 dec signed = 0x0000 hex = 0000000000000000 bin
32767 dec unsigned = 32767 dec signed = 0x7FFF hex = 0111111111111111 bin
32768 dec unsigned = -32768 dec signed = 0x8000 hex = 1000000000000000 bin
65535 dec unsigned = -1 dec signed = 0xFFFF hex = 1111111111111111 bin

Addition, Subtraktion, Multiplikation und Division macht technisch keinen unterschied zwischen Signed und Unsigned. Einzig Bitwise Operationen speziel der Right Shift funktionieren unter berücksichtigung des Vorzeichen Bits (wegen des Fehlens von vorzeichenlosen Datentypen gibt es in java auch den very Right Shift >>>). Zur Ausgabe in eine Konsole am ende einfach nur die ersten 16 bit betrachten: "(value & 0xFFFF)"

Edit: Nun gut die Vergleichsoperationen machen natürlich auch einen Unterschied :P
 
Zuletzt bearbeitet:
Bei der Division stimmts auch nicht: 0x0001/0xFFFF ist unsigned 0, signed -1=0xFFFF.

Das Beste wäre wohl wirklich, mit int zu rechnen und nach jeder Operation einmal die Bitmaske anzuwenden. Der Grund, warum bei Java keine Unsigned-Typen unterstützt, ist nebenbei schlicht, dass es Programmierer für doof hält.
 
Ich grübel nun schon ne ganze Weile wie ich es umsetzen würde. In C++ vermutlich mit Operator Überladung, aber das wird in Java leider nichts.
Die Idee nach jedem Schritt eine Division zu starten erscheint mir etwas oversized, auch wenn es natürlich nur eine kurze Operation ist. Einen Integer auf 16bit begrenzen geht rechts simpel mit eine "und" Verknüpfung. ein "wert & 0xFFF" verwirft in jedem Fall alles, was > 16bit ist. Aber für das Shiften von Signed auf Unsigned habe ich noch keine Idee. Jedes Mal den Wert neu interpretieren wäre wieder ein zu großer extra Aufwand.

Edit:
scheinbar hatte ich gerade einen Denkfehler. Das müsste sogar direkt mit der Maske funktionieren. Eine 32bit Zahl (egal ob signed oder unsigned) mit 16bit (0xFFFF) "&" verknüpft ist immer eine positive 16bit Zahl.
Damit funktionieren auch Bereichüberläufe problemlos, da bei Überschreitung von int16_max wieder 0 entsteht.
 
Zuletzt bearbeitet:
Da du in Java nicht selbst den Speicher managest, frage ich mich: Wie kommst du überhaupt zu dieser seltsamen Vorraussetzung?


Zum Thema Char: Kann man machen. Damit kannst du auch numerische Additionen von Sonderzeichen durchführen ...
Lesbarer wird der Code dadurch nicht, aber es geht.
Das ist aber schon echter 1337-H4X0R-Coding-Stil. :D
 
Dafür in Java Char zu verwenden ist eigentlich nicht unüblich. Die Sprache gibt in der Hinsicht einfach nicht mehr her. Da Char seit Unicode auch für die Verwendung als Zeichen nur bedingt brauchbar ist, spricht meiner Meinung nach nichts dagegen, dem Typ auf diese Weise wieder eine Daseinsberechtigung zu verleihen.

Ob der Code dadurch unlesbarer wird, als wenn ich nach jedem Schritt mit irgendwelchen Bitmasken hantieren muss, muss letztendlich jeder für sich bzw. für sein Projekt entscheiden.
 
Zurück