10

Delphi で 16 進値の文字列表現を整数値に変換する際に問題が発生しました。

例えば:

$FC75B6A9D025CB16 関数を使用すると、802829546 が表示されます。

Abs(StrToInt64('$FC75B6A9D025CB16'))

しかし、Windows の calc プログラムを使用すると、結果は次のようになります: 18191647110290852630

だから私の質問は:誰が正しいですか?私、または電卓?

誰かがすでにこの種の問題を抱えていますか?

4

4 に答える 4

11

実際802829546、ここでは明らかに間違っています。

Calc は 64 ビットの符号なし値 ( 18191647110290852630d) を返します。

Delphi Int64 型は、最上位ビットを符号として使用します。

Int := StrToInt64('$FC75B6A9D025CB16');
Showmessage(IntToStr(Int));

-255096963418698986正しい値を返します

64ビット署名より大きい値を扱う必要がある場合は、ここでArnaudの回答を確認してください。

于 2012-12-12T14:56:23.000 に答える
7

数値が大きすぎて、符号付き64ビット数値として表すことができません。

FC75B6A9D025CB16h = 18191647110290852630d

可能な最大の符号付き64ビット値は

2^63 - 1 = 9223372036854775807
于 2012-12-12T14:37:43.823 に答える
3

私は Delphi6 で作業しておりUint64、このバージョンにはタイプが存在しないため、「DFF Library」という名前の Delphi ライブラリを使用する必要がありました。
メインページ

16 進数値の文字列を 10 進数値の文字列に変換するコードは次のとおりです。

UBigIntsV3ユニットでの用途に追加する必要があります。

function StrHexaToUInt64Str(const stringHexadecimal: String): string;
var
  unBigInteger:TInteger;
begin
  unBigInteger:=TInteger.Create;
  try
    // stringHexadecimal parameter is passed without the '$' symbol
    // ex: stringHexadecimal:='FFAA0256' and not '$FFAA0256'
    unBigInteger.AssignHex(stringHexadecimal);
    //the boolean value determine if we want to add the thousand separator or not.
    Result:=unBigInteger.converttoDecimalString(false);
  finally
    unBigInteger.free;
  end;
end;
于 2012-12-13T14:48:24.900 に答える
3

大きな数を扱うには、デルファイ用の外部ライブラリが必要です

Pascal (Delphi) の大きな数

于 2012-12-12T14:44:19.540 に答える