Arithmetic Overflow bei UInt16 zu UInt32
-
hi,
ich schreibe noch nicht lange mit C# (vorher Delphi, C++ und Java) und hab da so ein Problemchen bekommen:
Ich habe zwei UInt16 bzw. ushort die ich zu einem UInt32 zusammenfassen will, wobei ein UInt16 das niederwertige Word und der andere das höherwertige Word darstellt.
Allerdings bekomm ich immer eine System.Overflow Exception.
readWord gibt ein ushort zurück.
In diesem Fall:
lowWord = 0x12FE
highWord = 0xAB0C
Ergebnis sollte eigentlich 0xAB0C12FE sein. (Gibt der Debugger im Watch auch prima aus...)try { UInt16 lowWord = readWord(addr); UInt16 highWord = readWord(addr+2); return (UInt32)(highWord * 0x10000 + lowWord); } catch(OverflowException oe) { Console.WriteLine("Message: " + oe.Message); return 0; }
danke schon mal
sm
-
Was ist mit:
UInt16 lowWord = readWord(addr); UInt16 highWord = readWord(addr+2); return (UInt32)((highWord << 16) + lowWord;
-
UInt16 lowWord = readWord(addr); UInt16 highWord = readWord(addr+2); return (UInt32)((highWord << 16) | lowWord;
Ist noch nen paar ms schneller
-
Dein Problem ist, dass 0x10000 nen Signed Integer ist und nicht uint, so wird das Zwischenergebniss deiner Berechnung auch nen Int, und der hat als MaxValue 0x7FFFFFFF und da passt dein Ergebniss nicht rein, also gibts ne Overflow Exception.
-
schrankwand schrieb:
Ist noch nen paar ms schneller
Also da wär ich jetzt mal auf ne Erklärung gespannt. Schließlich kann mein Prozessor eine Addition wie ein bitweises Oder in einem Takt ausführen. Selbst wenns ein Takt Unterschied wäre, wären das nur 0,4 ns. Oder kann mir C# hier noch irgendwas optimieren?
-
danke
und wenns mir um ein paar ms gegangen wär hätt ichs eh eher so gecodedmov eax, AB0Ch mul 10000h add eax, 12FEh
... oder so ähnlich