![]() |
mod mit Int64
Hallo,
nun, was ist mein Problem: Ich habe folgenden Code:
Delphi-Quellcode:
wobei dateValue,timeValue Int64 sind.
dateValue:= timeValue div(1000*24*60*60);
timeValue := timeValue mod (1000*24*60*60); Ich versuche folgenden Zahl zu dekodieren. $10FE3F2C1AD -> 1167760474541 In dem Delphi Programm bekomme ich als DateValue diesen Wert: 13515 und als TimeValue diesen: 64474541 und das ist nicht richtig. Mit dem Windows Rechner nachgerechnet ergibt sich folgendes: DateValue: 13515 TimeValue: 746233113425925925925925926 Gibt es eine Möglichkeit mod Int64 fest zumachen, oder gibt es einen Ersatz? Oder sollte ich das, so wie in der Hilfe beschrieben, zu Fuß rechnen : x mod y = x – (x div y) * y Einen schönen Nachmittag noch. Grüße Klaus |
Re: mod mit Int64
Der Compiler speichert int64-Werte einfach als 2 integer hintereinander, also
a:=4 (mit a vom int64) wird zu
Delphi-Quellcode:
Ein a mod b läfut allerdings so ab, dass er nur zwei 32bit (also nomrale) integer werte in eax<--a und edx<--b schiebt, und dann normal div macht. Dabei legt die ALU den ganzzahliegen Anteil des Ergebnisses in eax und den Rest in edx.
asm
mov dword ptr [esp], 4 ;low integer mov dword ptr [esp+4], 0 ;high integer end; Anders gesagt, das mod ist eine integrierte Funktion der CPU. Diese läuft auf 32bit-CPUs auch nur in 32bit Und du hast Recht, du müsstest dein modulo zu Fuß erledigen, so wie du es hingeschrieben hast. Edit: Nee, Kommando zurück. Laut Debugger macht der ja etwas anderes, der hat eine Funktion namens _llmod.... und sieht alles ganz gut aus :gruebel: [/delphi] |
Re: mod mit Int64
Hallo Klaus,
wenn es schnell gehen soll, dann nimm einfach UnixToDateTime(). Freundliche Grüße |
Re: mod mit Int64
Hallo Achim,
Zitat:
Sekunden. Ich brauche aber auch die Millisekunden. Grüße Klaus |
Re: mod mit Int64
Hallo Klaus,
ich habe 2 Fragen: 1. Warum hältst du das Ergebnis des Delphi-Programms für falsch? 2. Wie hast du mit dem Windows-Rechner diese gigantische Zahl erhalten? Gruß Hawkeye |
Re: mod mit Int64
Zitat:
1) weil nicht das herauskommt was herauskommen soll, deshalb halte ich das Ergebnis für falsch. 2) die sehr lange Zahl ist nicht gigantisch. Sie ist der Nachkommateil wenn ich 1167760474541 durch (1000*24*60*60) teile. Grüße Klaus |
Re: mod mit Int64
Vielleicht ist mein Gehirn ja schon im Wochenende, aber ich würde UnixToDateTime(x div 1000) einsetzen und die Millisekunden erhältst du doch mit mod 1000 - oder doch?
|
Re: mod mit Int64
Hallo Klaus,
Code:
Ich kann keinen Fehler erkennen...
1167760474541 div (1000*24*60*60) = 13515
1167760474541 mod (1000*24*60*60) = 64474541 13515 * (1000*24*60*60) + 64474541 = 1167760474541 // deine ursprüngliche Zahl Deine Antwort zum Punkt 2 läßt mich ahnen, wo dein Denkfehler liegen könnte: MOD liefert den ganzzahligen Rest, nicht den Nachkommaanteil des Quotienten. Um aber allen (Verständnis-)Schwierigkeiten aus dem Weg zu gehen, könntest du ja marabus Vorschlag folgen. Gruß Hawkeye |
Re: mod mit Int64
Hallo Hawkeye, Achim und Sirius,
wird Zeit das es Wochenende wird. Zitat:
Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz