2

UInt64Delphi 3 コンパイラ用に型を「再定義」しようとしています。その理由は、私は no を使用しsystem.pasないからsysinit.pasです。Integerしたがって、などのネイティブ var タイプしかありませんCardinal。どうすれば を再現できUInt64ますか?

4

2 に答える 2

3

Delphi 7 には、符号なし 64 ビット整数型がありません。ULARGE_INTEGER2 つの符号なし 32 ビット整数、または 1 つの符号付き 64 ビット整数のいずれかを保持するバリアント レコードとして定義されているWindows.pas からわかりますが、これはほとんど意味がありません。別のシステムの符号なし 64 ビット整数型とバイナリ互換性のあるものが本当に必要です。

符号なしの 64 ビット整数型にはコンパイラのサポートが必要ですが、コンパイラにはサポートがないため、作成できません。申し訳ありません。Delphi の新しいバージョンではコンパイラがサポートされているため、アップグレードを検討してください。

Delphi 3 はさらに悪く、64 ビットの整数型がなく、符号付きの型さえありません。Int64Delphi 4 で追加されたものであり、64 ビットの符号なし整数型を動作させる必要を回避するにはこれで十分かもしれませんが、Delphi 3 に行き詰まっている場合は、それでも動作しません。

補足として、一見この回答とは反対に、Delphi 7 にはUInt64型があります。ただし、これは非常に誤解を招く可能性があります。のように、このバージョンでは符号付き64 ビット整数型Int64です。

于 2013-12-14T09:47:17.973 に答える
3

コメントで説明したように、ここで本当に重要なのは、サポートしたい操作です。データ型は単純です。2 つの隣接する 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命令です。その符号は、符号付きダブル ワード ineaxを符号付きクワッド ワード in に拡張しedx:eaxます。

他の操作の実装は、ほぼ同じです。明らかに加算が最も簡単です。掛け算が少し難しくなります。


コメントで次のように述べています。

最新の BTMemoryModule.pas を移植して、.pas なしで動作させようとしていますUInt64。x64をサポートするように使用UInt64しますが、x86でのみ必要です。

コンパイラが 32 ビットであるため、x86 サポートのみが必要なので、実際には操作は必要ないと思いますUInt64。これらの変数を に置き換えますCardinal

于 2013-12-14T12:19:16.740 に答える