在Delphi 7中,int64s被签名,如果我尝试声明一个大于$ 8000000000000000的十六进制常量(例如,什么是uint64)我得到一个错误。你能告诉一些解决方法吗?
答案 0 :(得分:5)
您可以制作类似的变体记录
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
答案 1 :(得分:2)
如果没有编译器的支持,您没有太多选择。
我假设您希望将值传递给某个外部DLL中的函数。您必须将参数声明为带符号的64位整数Int64
。然后,您所能做的就是传入与所需无符号值具有相同位模式的带符号值。使用支持无符号64位整数的编译器构建自己的转换器工具。
答案 2 :(得分:2)
传统上,Broland实施遇到了互操作性问题,因为目标平台缺乏最大的 unsigned 。我记得使用LongInt
值代替DWORD
并等待从Turbo Pascal for Windows早期开始的麻烦。然后是Cardinal
幸福,但不,D4仅以其签名形式引入了最大整数Int64
。试。
所以你唯一的选择是依靠签名的基本类型Int64
并祈祷......等等,不,只需使用Int64Rec
类型转换来执行算术,最少和最重要的部分分开< /强>
回到常数声明:
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版(a.k.a Delphi 7)中编译并生成正确的结果。