11

Delphi 7 では、int64 は署名されています。$8000000000000000 より大きい 16 進数の定数を宣言しようとすると (たとえば、実際の uint64 は何か)、エラーが発生します。いくつかの回避策を教えてください。

4

3 に答える 3

6

次のようにバリアントレコードを作成できます

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
于 2011-06-17T00:33:02.637 に答える
2

コンパイラからのサポートがなければ、多くのオプションはありません。

外部 DLL の関数に値を渡したいと思っていると思います。パラメータを符号付き 64 ビット整数として宣言する必要がありますInt64。次にできることは、目的の符号なし値と同じビット パターンを持つ符号付き値を渡すことだけです。符号なし 64 ビット整数をサポートするコンパイラを使用して、小さな変換ツールを作成します。

于 2011-06-16T20:30:46.337 に答える
2

従来、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) で正しい結果が得られます。

于 2011-06-16T22:51:29.247 に答える