AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

2x Cardinal => 1x int64

Ein Thema von Weazy · begonnen am 8. Jun 2009 · letzter Beitrag vom 17. Aug 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Weazy
Weazy

Registriert seit: 7. Apr 2005
Ort: Bern (Schweiz)
414 Beiträge
 
Delphi 2007 Enterprise
 
#1

2x Cardinal => 1x int64

  Alt 8. Jun 2009, 02:26
Hallo, ich habe zwei Cardinal Werte welche zu einem int64 verschmelzen sollen. Der eine Cardinal enthält die ersten 32 Bits, der andere Cardinal die unteren 32 Bits des int64. Hier mal ein erster Versuch:

Delphi-Quellcode:
function CardToInt64(const high,low:cardinal):int64;
begin
  Result:=0; //mit 0 auffüllen
  Result:=high shl 32; //obere 4 Bytes setzten
  Result:=Result or low; // untere 4 Bytes setzten
end;
Leider scheint das verschieben mit shl nicht so ganz zu funktionieren, laut hilfe soll das nur für 32 bit integers funktionieren, wie könnte ich das hinbekommen? Die eignetliche Frage ist eigentlich nur wie ich "high" in der oberen Bereich des Resultats bekomme und ob es ev eine bessere Methode gibt?!?
Philippe Wechsler
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: 2x Cardinal => 1x int64

  Alt 8. Jun 2009, 03:00
Delphi-Quellcode:
function CardToInt64(const high,low:cardinal):int64;
begin
  Result:=int64(high) shl 32 or low;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: 2x Cardinal => 1x int64

  Alt 8. Jun 2009, 07:50
Hi,

Noch eine kleine Aufklärung warum deine function nicht funktioniert:

Result:=high shl 32; der Ausdruck wird von rechts nach links ausgewertet. high ist ein Cardinal. Wenn du einen 32-Bit Integer 32 Stellen nach links (oder rechts) verschiebst, dann bleibt 0 übrig..

00000000000000000000000000000000 11111111111111111111111111111111

shl 32

11111111111111111111111111111111 00000000000000000000000000000000

Der Linke Teil, also der Cardinal wird dann in einen Int64 konvertiert (implizit):

00000000000000000000000000000000 00000000000000000000000000000000

Und das mit low "verodert" ergibt eben low

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.734 Beiträge
 
Delphi 2007 Professional
 
#4

Re: 2x Cardinal => 1x int64

  Alt 8. Jun 2009, 09:19
Ungetestet:
Delphi-Quellcode:
uses SysUtils;

Int64Rec(AInt64).Hi := ACard1;
Int64Rec(AInt64).Lo := ACard2;
Uli Gerhardt
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: 2x Cardinal => 1x int64

  Alt 8. Jun 2009, 09:28
Hallo,

sowas riecht nach variant record

Delphi-Quellcode:
type
  Tvar_rec = packed record
    case i: Integer of
      0:
       (
          _card_low : Cardinal;
          _card_high : Cardinal;
       );
      1:
       (
        _int64: Int64;
       );
    end;

var
  rec: Tvar_rec;
begin
  rec._int64:= 12345;

  rec.card_low // auslesen oder setzen
  rec.card_high // auslesen oder setzen
weitere Infos dazu unter
records in Delphi

<Update>:
Oder den vordefinierten int64Rec benutzen, wie mein Vorgänger schon gezeugt hat ...


Heiko
PS: habs nicht getestet, vielleicht muss low und high noch vertauscht werden.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Weazy
Weazy

Registriert seit: 7. Apr 2005
Ort: Bern (Schweiz)
414 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: 2x Cardinal => 1x int64

  Alt 8. Jun 2009, 12:09
Danke für die Antworten! man merkt wohl das es gestern (heute) wieder mal spät wurde, ansonsten hätte ich das mit dem shl wohl geklärt
Philippe Wechsler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#7

Re: 2x Cardinal => 1x int64

  Alt 8. Jun 2009, 12:19
Zitat von hoika:
PS: habs nicht getestet, vielleicht muss low und high noch vertauscht werden.
nee, ist schon OK so ... in Windows fängt alles klein an und wird dann nach hinten immer größer
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: 2x Cardinal => 1x int64

  Alt 8. Jun 2009, 12:39
Zitat:
nee, ist schon OK so ... in Windows fängt alles klein an und wird dann nach hinten immer größer Smile
Little-Endian halt
http://de.wikipedia.org/wiki/Byte-Reihenfolge
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#9

Re: 2x Cardinal => 1x int64

  Alt 17. Aug 2009, 20:24
mir ist grad in einem Projekt etwas eigenartiges aufgefallen und ich konnte es jetzt auf 2 PCs genauso nachvollziehen.

Delphi-Quellcode:
var i, j: Integer;
  k: Int64;
begin
  i := 123;
  j := 456;
  k := (i shl 32) or j;
eigentlich müßte hier ja i3 = 456 sein, da wie Neutral General in Beitrag #3 schon richtig erklärte, der Wert von i aus dem Wertebereich rausverschoben werden sollte, ABER

ich bekomme 507 raus, also quasi
k := i or j; laut Debugger stimmt dieses tatsächlich, da der Wert von i, trotz erfolgreich ausgeführtem SHL-Befehl, im entsprechendem Register garnicht verändert wird.


[add] ach ja, hab hier einen kleinen Athlon64 drinnen
und ein WinXP SP3 mit 32 Bit
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: 2x Cardinal => 1x int64

  Alt 17. Aug 2009, 20:36
Man lese die Intel-Handbücher und staune:
Zitat:
The count is masked to 5 bits (or 6 bits if in 64-bit mode and REX.W is used).
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:12 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