Unsigned Ganzzahlen

Status
Nicht offen für weitere Antworten.

Siassei

Bekanntes Mitglied
Hallo,

ich hab ein kleines Problem mit den Primitiven - Typen in Java. Ich bekomme von einer Schnittstelle eine unsignierte Ganzzahl und muss mit diesem weiter rechnen. Aber wie :bahnhof:

Als erstes dachte ich z.B. an long (bei uint) und nimm den Speicherverbrauch einfach in kauf. Leider ist diese Lösung nicht akzeptable und ich muss das Problem mit dem gleichen Typ abhandeln :?

Ist sowas in Java irgendwie möglich? Bzw. muss ich den Wertbereich von signierten Bereich in Java akzeptieren?
 

Marco13

Top Contributor
Naja, das magische -Dsun.java.provideTheDataTypesThatINeed=true-Flag gibt's halt nicht. Wenn es um einen uint geht, könnte man entweder

- mit int rechnen, und immer im Hinterkopf behalten, dass die Zahlen eine andere Bedeutung haben könnten, als sie zu haben scheinen, und bei JEDER (JEDER) Rechnung überlegen, was dort schiefgehen oder das Ergebnis verfälschen könnte (sehr aufwändig)

- mit long rechnen, und immer im Hinterkopf behalten, dass die Zahlen eine andere Bedeutung haben könnten, als sie zu haben scheinen, und bei JEDER (JEDER) Rechnung überlegen, was dort schiefgehen oder das Ergebnis verfälschen könnte (vielleicht etwas weniger aufwändig)

Je nachdem, was man vorhat, könnte man sich auch eine Klasse basteln, die das Verhalten von uint simuliert, aber ob das auch nur den Hauch eines Sinnes macht, hängt STARK davon ab, was man genau machen will.
 

Siassei

Bekanntes Mitglied
Marco13 hat gesagt.:
Naja, das magische -Dsun.java.provideTheDataTypesThatINeed=true-Flag gibt's halt nicht. Wenn es um einen uint geht, könnte man entweder
Der ist gut ;)

Marco13 hat gesagt.:
- mit int rechnen, und immer im Hinterkopf behalten, dass die Zahlen eine andere Bedeutung haben könnten, als sie zu haben scheinen, und bei JEDER (JEDER) Rechnung überlegen, was dort schiefgehen oder das Ergebnis verfälschen könnte (sehr aufwändig)

- mit long rechnen, und immer im Hinterkopf behalten, dass die Zahlen eine andere Bedeutung haben könnten, als sie zu haben scheinen, und bei JEDER (JEDER) Rechnung überlegen, was dort schiefgehen oder das Ergebnis verfälschen könnte (vielleicht etwas weniger aufwändig)

Nun, zweiteres erscheind mir persönlich auch sinnvoll. Aber bei ulong scheidet diese Methode wohl aus. Zudem muss hier immer der int-Wert nach long umgerechnet werden. Da in diesem Fall Integer.minValue -> 0L ist.
Erstere erscheind mir auch sehr rechenintensiv.

Wo für benötige ich dies? Die Antwort ist eigentlich recht schnell gegeben. Ich bastle zur Zeit an einer ähnlichen Klasse wie BigInteger. Bevor hier jeder aufschreit sei noch mals betont "ähnlich"! Für das Vorzeichen habe ich mir ein Enum gebastelt und möchte verhindern, dass ich das Vorzeichen der Zahl in jedem Wert des Arrays mit speichere. Je nach zu bewältigen Aufgabe gibt es eine Klasse mit byte, int oder long.
 

Marco13

Top Contributor
Aufschreien würde ich da nicht. Im Gegenteil. Wollte ich bei Gelegenheit auch mal machen - bin aber nie dazu gekommen. Die BigInteger und BigDecimal sind ja schön und gut, aber sooo grottenlangsam :( (Wenn du mal eine effiziente BigDecimal-Implementierung gebastelt hast, sag bescheid :wink: ).

Aber einen Sinn in der Verwendung von byte, int oder long sehe ich nicht. Bytes werden intern eh wie ints gerechnet, und longs sind (auf bytecodeebene) auch nicht viel anders als zwei ints hintereinander - also, eigentlich sollte es int für alle Zwecke tun. Und ... du wirst da ja sowieso ein bißchen mit bits rumjonglieren, deswegen ist mir nicht klar, warum du nicht einfach so tust, als ob ein int nur 31 bit hätte....
 

Siassei

Bekanntes Mitglied
nun ja, weil ich nicht so genau weiß "Wie ich das ganze umsetze" :bahnhof:

Beispiel:

Ich habe ein int das 32bit hat und ich nehme es als unsigned an. Wie addiere ich nun z.B. 0x0000f0? Variable a + 0x0000f0 scheidet ja aus, da die JVM das ganze als signed an nimmt. Mit einem Bleistift und einen Zettel stellen die Grundoperationen Addieren, Subtrahieren, Multipl. und Division kein Problem dar, aber die Umsetzung in Java hat ein paar kleine Anlauf schwierigkeiten.

P.S. Das Projekt betreibe ich privat und stelle bei einem Erfolg die fertigen Klassen natürlich zur Verfügung ;)
 

Marco13

Top Contributor
Naja, man bräuchte jetzt ein konkretes Beispiel um zu wissen, was die Frage ist. Wenn du unsigned integers hättest, müßtest du ja "irgendwann" auch auf den Überlauf aufpassen ...
Code:
uint a0 = größteZahlDieInUintPasst;
uint a1 = 0;

void add(uint n)
{
    int newA0 = a0 + n;
    if (newA0 < a0) 
    {
        // Da war ein Überlauf! 
       a1++;
    }
    a0 = newA0;
}
(oder so ...) Und entsprecehnd eben mit int
Code:
int a0 = Integer.MAX_VALUE;
int a1 = 0;

void add(int n)
{
    int newA0 = a0 + n;
    if (newA0 < a0) 
    {
        // Da war ein Überlauf! 
       a1++;
       a0 = newA0 umgewurstet in eine positive Zahl
    }
    else
    {
        a0 = newA0;
    }
}
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben