如何在Delphi7中定义无符号的64位整数?

时间:2011-06-16 20:20:44

标签: delphi uint64

在Delphi 7中,int64s被签名,如果我尝试声明一个大于$ 8000000000000000的十六进制常量(例如,什么是uint64)我得到一个错误。你能告诉一些解决方法吗?

3 个答案:

答案 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)中编译并生成正确的结果。