Delphi 7 では、int64 は署名されています。$8000000000000000 より大きい 16 進数の定数を宣言しようとすると (たとえば、実際の uint64 は何か)、エラーが発生します。いくつかの回避策を教えてください。
3 に答える
次のようにバリアントレコードを作成できます
type muint64 = record
case boolean of
true: (i64 : int64);
false:(lo32, hi32: cardinal);
end;
これで、基数を使用して uint64 に符号なしデータを入力できます。
他のオプションは、次のようなコードを使用することです。
const almostmaxint64 = $800000045000000;
var muint64: int64;
begin
muint64:= almostmaxint64;
muint64:= muint64 shl 1;
end
コンパイラからのサポートがなければ、多くのオプションはありません。
外部 DLL の関数に値を渡したいと思っていると思います。パラメータを符号付き 64 ビット整数として宣言する必要がありますInt64
。次にできることは、目的の符号なし値と同じビット パターンを持つ符号付き値を渡すことだけです。符号なし 64 ビット整数をサポートするコンパイラを使用して、小さな変換ツールを作成します。
従来、Broland の実装は、ターゲット プラットフォームでサポートされている最大の未署名が不足しているため、相互運用性の問題に悩まされていました。Turbo Pascal for Windows の非常に初期の頃から、LongInt
代わりに値を使用してトラブルを待っていたことを覚えています。DWORD
それからCardinal
幸福でしたが、いいえ、D4Int64
は符号付き形式でのみ最大の整数を導入しました。また。
したがって、あなたの唯一の選択肢は、符号付き基本型に依存してInt64
祈ることです...待ってください、いいえ、Int64Rec
タイプキャストを使用して、最下位部分と最上位部分で別々に算術演算を実行してください。
定数宣言に戻る:
const
foo = $8000004200000001; // this will work because hexadecimal notation is unsigned by its nature
// however, declared symbol foo becomes signed Int64 value
// attempting to use decimal numeral will result in "Integer constant too large" error
// see "True constants" topic in D7 Help for more details
procedure TForm1.FormCreate(Sender: TObject);
begin
// just to verify
Caption := IntToHex(foo, SizeOf(Int64) * 2);
end;
残念ながら、他の回避策はコンパイラを変更することです。Free Pascal は常に符号付きと符号なしの型の同期を保ちます。
このスニペットはコンパイルされ、Borland Delphi バージョン 15.0 (別名 Delphi 7) で正しい結果が得られます。