![]() |
2x Cardinal => 1x int64
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:
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?!?
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; |
Re: 2x Cardinal => 1x int64
Delphi-Quellcode:
function CardToInt64(const high,low:cardinal):int64;
begin Result:=int64(high) shl 32 or low; end; |
Re: 2x Cardinal => 1x int64
Hi,
Noch eine kleine Aufklärung warum deine function nicht funktioniert:
Delphi-Quellcode:
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..
Result:=high shl 32;
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 |
Re: 2x Cardinal => 1x int64
Ungetestet:
Delphi-Quellcode:
uses SysUtils;
Int64Rec(AInt64).Hi := ACard1; Int64Rec(AInt64).Lo := ACard2; |
Re: 2x Cardinal => 1x int64
Hallo,
sowas riecht nach variant record
Delphi-Quellcode:
weitere Infos dazu unter
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 ![]() <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. |
Re: 2x Cardinal => 1x int64
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;-)
|
Re: 2x Cardinal => 1x int64
Zitat:
|
Re: 2x Cardinal => 1x int64
Zitat:
![]() |
Re: 2x Cardinal => 1x int64
mir ist grad in einem Projekt etwas eigenartiges aufgefallen und ich konnte es jetzt auf 2 PCs genauso nachvollziehen.
Delphi-Quellcode:
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
var i, j: Integer;
k: Int64; begin i := 123; j := 456; k := (i shl 32) or j; ich bekomme 507 raus, also quasi
Delphi-Quellcode:
laut Debugger stimmt dieses tatsächlich, da der Wert von i, trotz erfolgreich ausgeführtem SHL-Befehl, im entsprechendem Register garnicht verändert wird. :shock:
k := i or j;
[add] ach ja, hab hier einen kleinen Athlon64 drinnen und ein WinXP SP3 mit 32 Bit |
Re: 2x Cardinal => 1x int64
Man lese die Intel-Handbücher und staune:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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