2

我正在尝试“重新定义” UInt64Delphi 3 编译器的类型。原因是我不使用system.pasnor sysinit.pas。所以我只有原生 var 类型,比如IntegerCardinal。我怎么能重现UInt64

4

2 回答 2

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指令。该符号将带符号的双字 in 扩展eax为带符号的四字 in edx:eax

实现其他操作大体相似。显然加法是最简单的。乘法变得有点困难。


在您声明的评论中:

我正在尝试移植最新的 BTMemoryModule.pas 以使其在没有UInt64. 它使用UInt64它支持 x64,但我只需要它用于 x86。

由于您只需要 x86 支持,因为您的编译器是 32 位的,所以我认为您实际上不需要UInt64操作。您将这些变量替换为Cardinal.

于 2013-12-14T12:19:16.740 回答
3

Delphi 7 没有无符号 64 位整数类型。您可以从它的 Windows.pas 中看出,其中ULARGE_INTEGER定义为包含两个无符号 32 位整数或一个有符号 64 位整数的变体记录,这没有什么意义,直到您意识到如果您意识到这只是最不坏的选择确实需要与来自另一个系统的无符号 64 位整数类型二进制兼容的东西。

无符号 64 位整数类型需要编译器支持,而您的编译器缺少该支持,因此您无法创建它,抱歉。较新的 Delphi 版本确实具有对其的编译器支持,因此您可能会考虑升级。

Delphi 3 更糟糕,它没有任何 64 位整数类型,甚至没有带符号的类型。Int64是在 Delphi 4 中添加的,这可能足以避免需要一个工作的 64 位无符号整数类型,但如果你被困在 Delphi 3 上,那么即使这样也行不通。

作为旁注,似乎与这个答案相反,Delphi 7 确实有一个UInt64类型。然而,这是高度误导的。在这个版本中它是一个有符号的64 位整数类型,就像Int64.

于 2013-12-14T09:47:17.973 回答