Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TObject und negativer Int64 (https://www.delphipraxis.net/207044-tobject-und-negativer-int64.html)

Int3g3r 19. Feb 2021 18:53

TObject und negativer Int64
 
Guten Abend,

Kann mir jemand erläutern was bei folgendem Code genau passiert ?
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var myObj:TObject;
    negNumber: Int64;
begin
  negNumber := -1;
  myObj := TObject(negNumber);
  showmessage(int64(myObj).ToString);
end;
Bei showmessage() wird mir 4294967295 ausgegeben. Ich erwarte aber -1.

Habe bereits einen ähnlichen Artikel gefunden bei dem es um einen extended geht.
https://www.delphipraxis.net/151440-...-extended.html

Ich benötige den Cast ins TObject auch um einer Liste eine ID mitzugeben.
Wie dort beschrieben wäre eine Lösung eine helper Klasse zu erstellen, find ich eigentlich gut soweit. Ich möchte nur verstehen warum bei meinem Beispiel oben nicht -1 ausgegeben wird.

Gruss Int3g3r

PS: Ist eine 32bit Applikation.

bernau 19. Feb 2021 19:03

AW: TObject und negativer Int64
 
Ein Pointer ist 32Bit

Int64 64Bit.

Da passt vielleicht etwas nicht zusammen.

Nur ne Vermutung

Was passiert, wenn du aus dem Int64 ein "normales" integer machst. Nur Probehalber mal.

himitsu 19. Feb 2021 20:05

AW: TObject und negativer Int64
 
Klar, man kann über Integer als Zwischenschritt casten, dann sind im Nagetiven 2 Millarden Werte verfügbar, aber dafür geht es im Positiven nun statt bis 4 nur noch bis 2 Milliarden, von den paar Trilliarden des Int64.
Wenn du mal nachsiehts, was mit den Bits im Zweierkomplement los ist, dann weißt du auch warum.


Fazit: Mach es richtig.

Es soll ein Object sein, also nimm auch ein Daten-Objekt und pack den Wert dort rein.

Delphi-Quellcode:
type
  TMyData = class
    Value: Int64;
    constructor Create(Value: Int64);
  end;


procedure TForm1.Button3Click(Sender: TObject);
var myObj:TObject;
    negNumber: Int64;
begin
  negNumber := -1;
  myObj := TMyData.Create(negNumber);
  showmessage(TMyData(myObj).Value.ToString);

  // irgendwo nicht vergessen
  myObj.Free;
end;







Oder das Programm in 64 Bit compilieren. :lol:

Int3g3r 23. Feb 2021 09:29

AW: TObject und negativer Int64
 
Besten Dank für die Antworten


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 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