我正在尝试“重新定义”Delphi 3编译器的UInt64
类型。
原因是我不使用system.pas
也不使用sysinit.pas
。
所以我只有Integer
,Cardinal
等原生var类型。
我怎样才能重现UInt64
?
答案 0 :(得分:3)
Delphi 7没有无符号的64位整数类型。你可以从它的Windows.pas中看出,其中ULARGE_INTEGER
被定义为一个变量记录,它包含两个无符号的32位整数,或者一个带符号的64位整数,这没什么意义,直到你意识到这一点为止。如果你真的需要与另一个系统中的无符号64位整数类型兼容的东西,那么这只是最不好的选择。
无符号的64位整数类型需要编译器支持的编译器支持,所以你不能创建它,抱歉。较新的Delphi版本确实有编译支持,因此您可以考虑升级。
Delphi 3更糟糕,它没有任何64位整数类型,甚至没有签名的整数类型。在Delphi 4中添加了Int64
,这可能足以避免需要一个工作的64位无符号整数类型,但是如果你仍然坚持使用Delphi 3,那么即使这样也行不通。
作为旁注,看起来与此答案相反,Delphi 7确实有UInt64
类型。但是,这极具误导性。它在此版本中是签名的 64位整数类型,就像Int64
一样。
答案 1 :(得分:3)
正如我在评论中所解释的那样,这里真正重要的是您希望支持哪些操作。数据类型很简单。您将其表示为两个相邻的32位整数。但复杂性在于对该数据类型实施操作。
在32位机器上,不能直接在64位整数上运行,因此需要使用32位CPU的功能构建64位操作。
以下是如何通过带符号的32位整数实现无符号64位整数递增的示例。
type
UInt64 = record
Lo: Cardinal;
Hi: Cardinal;
end;
procedure Increment(var op1: UInt64; op2: Integer);
// IN: eax = pointer to op1; edx = op2
asm
mov ecx,eax
mov eax,edx
cdq
add eax,[ecx]
adc edx,[ecx+4]
mov [ecx],eax
mov [ecx+4],edx
end;
此函数的棘手部分是cdq
指令。该符号将eax
中已签名的双字扩展为edx:eax
中已签名的四字。
实施其他操作大致相似。显然,添加是最简单的。乘法变得更加困难。
在评论中说明:
我正在尝试移植最新的BTMemoryModule.pas以使其在没有
UInt64
的情况下工作。它使用UInt64
所以它支持x64但我只需要x86。
由于您只需要x86支持,因为您的编译器是32位,那么我认为您实际上不需要UInt64
操作。您可以使用Cardinal
替换这些变量。