UInt64
Delphi 3 コンパイラ用に型を「再定義」しようとしています。その理由は、私は no を使用しsystem.pas
ないからsysinit.pas
です。Integer
したがって、などのネイティブ var タイプしかありませんCardinal
。どうすれば を再現できUInt64
ますか?
2 に答える
Delphi 7 には、符号なし 64 ビット整数型がありません。ULARGE_INTEGER
2 つの符号なし 32 ビット整数、または 1 つの符号付き 64 ビット整数のいずれかを保持するバリアント レコードとして定義されているWindows.pas からわかりますが、これはほとんど意味がありません。別のシステムの符号なし 64 ビット整数型とバイナリ互換性のあるものが本当に必要です。
符号なしの 64 ビット整数型にはコンパイラのサポートが必要ですが、コンパイラにはサポートがないため、作成できません。申し訳ありません。Delphi の新しいバージョンではコンパイラがサポートされているため、アップグレードを検討してください。
Delphi 3 はさらに悪く、64 ビットの整数型がなく、符号付きの型さえありません。Int64
Delphi 4 で追加されたものであり、64 ビットの符号なし整数型を動作させる必要を回避するにはこれで十分かもしれませんが、Delphi 3 に行き詰まっている場合は、それでも動作しません。
補足として、一見この回答とは反対に、Delphi 7 にはUInt64
型があります。ただし、これは非常に誤解を招く可能性があります。のように、このバージョンでは符号付き64 ビット整数型Int64
です。
コメントで説明したように、ここで本当に重要なのは、サポートしたい操作です。データ型は単純です。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
。