我有一个十六进制值的字符串表示形式转换与德尔福整数值的问题。
例如:
$ FC75B6A9D025CB16给我802829546当我使用的功能:
Abs(StrToInt64('$FC75B6A9D025CB16'))
但是,如果使用的计算程序从Windows,其结果是:18191647110290852630
所以我的问题是:谁的权利? 我,或者钙?
是否有人已经有这样的问题?
我有一个十六进制值的字符串表示形式转换与德尔福整数值的问题。
例如:
$ FC75B6A9D025CB16给我802829546当我使用的功能:
Abs(StrToInt64('$FC75B6A9D025CB16'))
但是,如果使用的计算程序从Windows,其结果是:18191647110290852630
所以我的问题是:谁的权利? 我,或者钙?
是否有人已经有这样的问题?
事实上802829546
显然是错在这里。
计算值返回一个64位无符号值( 18191647110290852630d
)。
德尔福的Int64类型使用最高位为标志:
Int := StrToInt64('$FC75B6A9D025CB16');
Showmessage(IntToStr(Int));
返回值-255096963418698986
这是正确的
如果你需要比签订64位值较大的工作,然后检查了这里阿尔诺的答案 。
数量太大而不能表示为一个符号的64位数字。
FC75B6A9D025CB16h = 18191647110290852630d
最大的可能签署的64位值
2^63 - 1 = 9223372036854775807
用大数字工作,你需要德尔福外部库
帕斯卡大量(德尔福)
我不得不使用名为“DFF库”,是因为我对的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;