在Delphi 3中重现UInt64

时间:2013-12-14 09:13:01

标签: delphi delphi-3

我正在尝试“重新定义”Delphi 3编译器的UInt64类型。 原因是我不使用system.pas也不使用sysinit.pas。 所以我只有IntegerCardinal等原生var类型。 我怎样才能重现UInt64

2 个答案:

答案 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替换这些变量。