Delphi 为什么我的应用程序中的基数类型发生了变化?

Delphi 为什么我的应用程序中的基数类型发生了变化?,delphi,delphi-2006,delphi-3,Delphi,Delphi 2006,Delphi 3,我有一个在Delphi3中运行良好的程序,我在TurboDelphi2006上编译并测试了它,发现了一个问题。问题是:我使用了“基数”数据类型作为索引。它在Delphi3中工作,但我发现值比TurboDelphi2006编译版本中的值大128-256左右,具体取决于具体数据。将这些数据类型更改为“longint”修复了该问题,使程序能够在两个编译器中正确运行 问题:为什么会这样? 我的理解是基数数据类型只是典型的无符号整数数据。这与它们在本程序中的应用是一致的,特别是Delphi3编译工作正常的

我有一个在Delphi3中运行良好的程序,我在TurboDelphi2006上编译并测试了它,发现了一个问题。问题是:我使用了“基数”数据类型作为索引。它在Delphi3中工作,但我发现值比TurboDelphi2006编译版本中的值大128-256左右,具体取决于具体数据。将这些数据类型更改为“longint”修复了该问题,使程序能够在两个编译器中正确运行

问题:为什么会这样?


我的理解是基数数据类型只是典型的无符号整数数据。这与它们在本程序中的应用是一致的,特别是Delphi3编译工作正常的事实证明了这一点。那么为什么turbodelphi2006编译不起作用呢?

在Delphi中,无符号类型只是下一个较大的有符号类型的子范围类型。在Delphi3中,没有64位类型,因此没有下一个更大的类型将Cardinal作为其子范围。Cardinal是Delphi3中的一种有符号类型,因为该语言存在技术限制。Delphi4引入了Int64,并将Cardinal设置为该类型的无符号子范围(然后限制为没有无符号64位类型)

简而言之,你从一开始就没有得到真正的未签名行为。现在您已经升级了,您已经暴露了代码中长期存在的问题


您编译的代码并不能证明您的代码是正确的。Delphi 3无法强制执行需要它实际上没有的类型的规则。

没有代码,很难帮助解决问题,因此代码没有真正的帮助问题。我只是想知道为什么我观察我所做的。我相信答案如下。我一点也不明白。什么是UInt64?它又如何解释所报道的行为呢?@David,UInt64是一种直到最近才出现的类型。当Delphi版本是单位数(可能是更高版本)时,无符号类型是较大的有符号类型的子范围:要使UInt64存在,还需要一个Int128类型。我不确定在现代版本中是否仍然如此。没有Int128。但UInt64是存在的。但我还是不明白你的意思。我在哪里可以了解更多信息?@DavidHeffernan-Cardinal是Delphi2中的31位类型-3@David,这是我十年前在新闻组学到的东西,所以检查新闻组档案,如果它们追溯到那么远的地方。我不知道它目前被记录在哪里,甚至不知道它是否仍然是编译器内部如何表示无符号类型的准确描述。不过,对于我提到的版本来说,这绝对是正确的。Delphi4没有UInt64类型,尽管有一些用于无符号64位算术的内部库函数(例如,
lludiv
);他们只是没有暴露在语言层面。