我有一个问题,用Delphi转换整数值的十六进制值的字符串表示。
例如:
当我使用该功能时,$ FC75B6A9D025CB16给我802829546:
Abs(StrToInt64('$FC75B6A9D025CB16'))
但如果我使用Windows的calc程序,结果是:18191647110290852630
所以我的问题是:谁是对的?我,还是计算?
有人有这种问题吗?
答案 0 :(得分:10)
事实上,802829546
显然是错误的。
Calc返回64位无符号值(18191647110290852630d
)。
Delphi Int64类型使用最高位作为符号:
Int := StrToInt64('$FC75B6A9D025CB16');
Showmessage(IntToStr(Int));
返回值-255096963418698986
,这是正确的
如果您需要处理大于64位签名的值,请查看Arnaud's answer here。
答案 1 :(得分:7)
该数字太大,无法表示为带符号的64位数字。
FC75B6A9D025CB16h = 18191647110290852630d
最大可能的带符号64位值是
2^63 - 1 = 9223372036854775807
答案 2 :(得分:3)
使用大数字你需要外部库用于delphi
答案 3 :(得分:2)
我不得不使用名为“DFF Library”的Delphi库,因为我使用的是Delphi6,此版本中不存在Uint64
类型。
Main page
这是我将十六进制值字符串转换为十进制值字符串的代码:
您需要在单位中添加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;