AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

mod mit Int64

Ein Thema von Klaus01 · begonnen am 26. Jan 2007 · letzter Beitrag vom 26. Jan 2007
Antwort Antwort
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#1

mod mit Int64

  Alt 26. Jan 2007, 14:19
Hallo,

nun, was ist mein Problem:

Ich habe folgenden Code:

Delphi-Quellcode:
  dateValue:= timeValue div(1000*24*60*60);
  timeValue := timeValue mod (1000*24*60*60);
wobei dateValue,timeValue Int64 sind.

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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: mod mit Int64

  Alt 26. Jan 2007, 14:46
Der Compiler speichert int64-Werte einfach als 2 integer hintereinander, also
a:=4 (mit a vom int64) wird zu
Delphi-Quellcode:
asm
  mov dword ptr [esp], 4 ;low integer
  mov dword ptr [esp+4], 0 ;high integer
end;
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.

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




[/delphi]
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: mod mit Int64

  Alt 26. Jan 2007, 14:51
Hallo Klaus,

wenn es schnell gehen soll, dann nimm einfach UnixToDateTime().

Freundliche Grüße
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: mod mit Int64

  Alt 26. Jan 2007, 15:00
Hallo Achim,

Zitat:
wenn es schnell gehen soll, dann nimm einfach UnixToDateTime().
hatte ich schon genommen, UnixToDateTime hat aber als kleinste Einheit
Sekunden. Ich brauche aber auch die Millisekunden.


Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: mod mit Int64

  Alt 26. Jan 2007, 15:20
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: mod mit Int64

  Alt 26. Jan 2007, 15:38
Zitat von Hawkeye219:
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?
Hallo Hawkeye,

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
Klaus
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: mod mit Int64

  Alt 26. Jan 2007, 15:43
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?
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: mod mit Int64

  Alt 26. Jan 2007, 15:50
Hallo Klaus,

Code:
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
Ich kann keinen Fehler erkennen...

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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: mod mit Int64

  Alt 26. Jan 2007, 16:08
Hallo Hawkeye, Achim und Sirius,

wird Zeit das es Wochenende wird.

Zitat:
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.
Wünsche Euch ein schönes
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz