我在用 Delphi 将十六进制值的字符串表示形式转换为整数值时遇到了问题。
例如:
当我使用该功能时,$FC75B6A9D025CB16 给我 802829546:
Abs(StrToInt64('$FC75B6A9D025CB16'))
但如果我使用 Windows 的 calc 程序,结果是:18191647110290852630
所以我的问题是:谁是对的?我,还是计算?
有人已经有这种问题了吗?
我在用 Delphi 将十六进制值的字符串表示形式转换为整数值时遇到了问题。
例如:
当我使用该功能时,$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
要处理大数字,您需要用于 delphi 的外部库
我不得不使用一个名为“DFF Library”的 Delphi 库,因为我在 Delphi6 上工作,并且Uint64
此版本中不存在该类型。
主页
这是我将十六进制值字符串转换为十进制值字符串的代码:
您需要添加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;