Delphi で 16 進値の文字列表現を整数値に変換する際に問題が発生しました。
例えば:
$FC75B6A9D025CB16 関数を使用すると、802829546 が表示されます。
Abs(StrToInt64('$FC75B6A9D025CB16'))
しかし、Windows の calc プログラムを使用すると、結果は次のようになります: 18191647110290852630
だから私の質問は:誰が正しいですか?私、または電卓?
誰かがすでにこの種の問題を抱えていますか?
Delphi で 16 進値の文字列表現を整数値に変換する際に問題が発生しました。
例えば:
$FC75B6A9D025CB16 関数を使用すると、802829546 が表示されます。
Abs(StrToInt64('$FC75B6A9D025CB16'))
しかし、Windows の calc プログラムを使用すると、結果は次のようになります: 18191647110290852630
だから私の質問は:誰が正しいですか?私、または電卓?
誰かがすでにこの種の問題を抱えていますか?
実際802829546、ここでは明らかに間違っています。
Calc は 64 ビットの符号なし値 ( 18191647110290852630d) を返します。
Delphi Int64 型は、最上位ビットを符号として使用します。
Int := StrToInt64('$FC75B6A9D025CB16');
Showmessage(IntToStr(Int));
-255096963418698986正しい値を返します
64ビット署名より大きい値を扱う必要がある場合は、ここでArnaudの回答を確認してください。
数値が大きすぎて、符号付き64ビット数値として表すことができません。
FC75B6A9D025CB16h = 18191647110290852630d
可能な最大の符号付き64ビット値は
2^63 - 1 = 9223372036854775807
私は 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;
大きな数を扱うには、デルファイ用の外部ライブラリが必要です