Die Frage ist nur: Warum funktioniert es unter 32Bit nicht?
Es ist ein komplett anderer Compiler.
Im
Win32 wird Int64 auch noch "emuliert", denn die CPU hat ja nur 32 Bit, also das +1 berechnet nicht die CPU mit "einem" Assemblerbefehl, sondern es erledigt Delphi, über zwei Int32. Teilweise über monströse Funktionen in der System.pas.
Delphi-Quellcode:
// Win32
Unit1.pas.29: X := X + 1;
0060E3A9 8B45F0 mov eax,[ebp-$10]
0060E3AC 8B55F4 mov edx,[ebp-$0c]
0060E3AF 83C001 add eax,$01
0060E3B2 83D200 adc edx,$00
0060E3B5 8945F0 mov [ebp-$10],eax
0060E3B8 8955F4 mov [ebp-$0c],edx
// Win64
Unit1.pas.29: X := X + 1;
000000000070ADA8 4883450801 add qword ptr [rbp+$08],$01
Delphi-Quellcode:
{ 64-bit Integer helper routines }
{$IF defined(CPU386) and defined(ASSEMBLER)}
procedure __llmul;
procedure __lldiv;
procedure __lludiv;
procedure __llmod;
procedure __llmulo;
procedure __llumulo;
procedure __lldivo;
procedure __llmodo;
procedure __llumod;
procedure __llshl;
procedure __llushr;
{$ENDIF}
In
Win32 sieht der Aufruf also quasi so aus
lTest.SetTo2(lCount).SetI(__lladd(lCount, 1)).WriteInt; // __lladd ist aber eine Inline-Funktion vom Compiler
und hier wird das __lladd wohl zu früh ausgeführt, vor SetTo2.