如何在Delphi7中定义无符号64位整数?
在Delphi7中,INT64是有符号的,如果我试图声明一个大于$80000000000000的十六进制常量(例如,什么是真正的uint64),我会得到一个错误。你能建议一些解决方法吗?如果没有编译器的支持,你没有很多选择如何在Delphi7中定义无符号64位整数?,delphi,uint64,Delphi,Uint64,在Delphi7中,INT64是有符号的,如果我试图声明一个大于$80000000000000的十六进制常量(例如,什么是真正的uint64),我会得到一个错误。你能建议一些解决方法吗?如果没有编译器的支持,你没有很多选择 我假定您希望将值传递给某个外部DLL中的函数。您必须将参数声明为有符号64位整数,Int64。然后,您所能做的就是传入与所需无符号值具有相同位模式的有符号值。使用支持无符号64位整数的编译器为自己构建一个小型转换器工具。传统上,Broland实现遇到互操作性问题,因为目标平台
我假定您希望将值传递给某个外部DLL中的函数。您必须将参数声明为有符号64位整数,
Int64
。然后,您所能做的就是传入与所需无符号值具有相同位模式的有符号值。使用支持无符号64位整数的编译器为自己构建一个小型转换器工具。传统上,Broland实现遇到互操作性问题,因为目标平台不支持最大的无符号。我记得我使用了LongInt
值,而不是DWORD
,并且从Turbo Pascal for Windows的早期就开始等待出现问题。然后是幸福,但不是,D4只引入了有符号形式的最大整数Int64。再说一遍
因此,您唯一的选择是依赖于有符号基本类型Int64
,然后。。。等等,不,只需使用Int64Rec
typecast分别对最低和最高有效部分执行算术运算即可
返回常量声明:
const
foo = $8000004200000001; // this will work because hexadecimal notation is unsigned by its nature
// however, declared symbol foo becomes signed Int64 value
// attempting to use decimal numeral will result in "Integer constant too large" error
// see "True constants" topic in D7 Help for more details
procedure TForm1.FormCreate(Sender: TObject);
begin
// just to verify
Caption := IntToHex(foo, SizeOf(Int64) * 2);
end;
不幸的是,另一个解决方法是更改编译器。Free Pascal始终保持有符号和无符号类型同步
此代码段在Borland Delphi版本15.0(又称Delphi 7)中编译并生成正确的结果。您可以这样创建一个变体记录
type muint64 = record
case boolean of
true: (i64 : int64);
false:(lo32, hi32: cardinal);
end;
现在,您可以使用基数用未签名的数据填充uint64
另一种选择是使用如下代码:
const almostmaxint64 = $800000045000000;
var muint64: int64;
begin
muint64:= almostmaxint64;
muint64:= muint64 shl 1;
end
delphi的较新版本也有UINT64。没有,因为您没有回答这个问题。如果我没有记错,那么缺少这些类型的原因是为了在UINT64和有符号类型之间进行计算,您需要一个至少65位宽的内部类型。(对于红衣主教/长词大小写,将64替换为32,将65替换为33)。获得正确的结果要比仅仅拥有签名类型困难得多。解决方法:获得一个具有UINT64@Warren购买新版本根本不符合解决办法的要求。学习一些内联汇编程序。:-)导入一个用Visual C++或Frasasalk或其他语言编写的DLL……你刚刚发明了代码>此外,应使用基本的
长单词
类型,而不是通用的基数
。此外,DWORD被交换。@down我知道这就是op要求的解决方案,这不是意味着代码而不是文本吗?