Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi7中定义无符号64位整数?_Delphi_Uint64 - Fatal编程技术网

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

如何在Delphi7中定义无符号64位整数?,delphi,uint64,Delphi,Uint64,在Delphi7中,INT64是有符号的,如果我试图声明一个大于$80000000000000的十六进制常量(例如,什么是真正的uint64),我会得到一个错误。你能建议一些解决方法吗?如果没有编译器的支持,你没有很多选择 我假定您希望将值传递给某个外部DLL中的函数。您必须将参数声明为有符号64位整数,Int64。然后,您所能做的就是传入与所需无符号值具有相同位模式的有符号值。使用支持无符号64位整数的编译器为自己构建一个小型转换器工具。传统上,Broland实现遇到互操作性问题,因为目标平台

在Delphi7中,INT64是有符号的,如果我试图声明一个大于$80000000000000的十六进制常量(例如,什么是真正的uint64),我会得到一个错误。你能建议一些解决方法吗?

如果没有编译器的支持,你没有很多选择


我假定您希望将值传递给某个外部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要求的解决方案,这不是意味着代码而不是文本吗?