Problem Umsetzung von C# nach JAVA - unsigned Variablen

Hallo Zusammen,

ich bin seit einiger Zeit dabei mich nun endlich auch mit JAVA zu beschäftigen.
Dazu versuche ich auch meine "alten" Codeschnippsel in JAVA umzusetzen.

Da es in JAVA ja keine unsigned werte gibt wird ja immer geraten auf größere Datentypen zu gehen. Bei folgendem Code verrechnet sich mein Code immer wieder und ich komm einfach nicht dahinter. Bin mittlerweile bis auf BigInteger umgestiegen um negative werte zu vermeiden.

C# Code
Code:
uint uiInput = 168428516; //0x0a0a03e4;

    ulong ulRet = 0;
    ulRet = uiInput * (20 * uiInput + 7) / 0x55u + 112; 
//  Ergebnis 0x0000000001d4f3ec
JAVA Versuch
Code:
long Input =  0x0a0a03e4l;;
        
        long ulRet = 0;
 
        long step1 = 20 * Input + 7;
        BigInteger bStep1 = BigInteger.valueOf(step1);
        BigInteger step2 = bStep1.multiply(BigInteger.valueOf(Input)); 
        BigInteger step3 = step2.divide(BigInteger.valueOf(0x55)); 
        BigInteger Step4 = step3.add(BigInteger.valueOf(122));
    
        
        ulRet = Step4.longValue();
        
        System.out.print(ulRet);
Ich schaffe es nicht in JAVA selbiges Ergebnis zu erzeugen. Hab ich was wichtiges übersehen oder missverstanden. Freue mich über jeden Tip.

Cheerz
Mortiis
 
dein c#-code läuft auch bei 64 32 bit über. BigInteger dagegen wächst dynamisch (hab die doku aber nur überflogen, also nochmal kontrollieren).
den überlauf kannst du in java simulieren, indem du nach jeder zwischenoperation mod 2^64 2^32 rechnest.
 
Zuletzt bearbeitet:
das ist kein 64 bit überlauf ... das ist ein 32 bit überlauf ...

Code:
 (20 * uiInput + 7) // ist in c# ein 32-Bit Integer
Code:
(20L * uiInput + 7) // ist der eigentlich vermutete 64 Bit Integer
um das gleiche überlaufende ergebnis zu bekommen müsste step2 vor der division auf die niederwertigen 32 bit reduziert werden ... sprich ein logisches und mit (1L<<32)-1
 
Zurück
Oben