3

我在这里有一个程序,它在 Delphi 3 中运行良好,我在 Turbo Delphi 2006 上编译和测试,发现了一个问题。问题是这样的:我使用“基本”数据类型作为某些东西的索引。它在 Delphi 3 中工作,但我发现值比 Turbo Delphi 2006 编译版本中的值大约 128-256 左右,具体取决于具体数据。将这些数据类型更改为“longint”解决了问题,因此程序可以在两个编译器上正常工作。

问题:这是为什么?

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

4

1 回答 1

5

在 Delphi 中,无符号类型只是下一个更大的有符号类型的子范围类型。在 Delphi 3 中,没有 64 位类型,因此 Cardinal 没有下一个更大的类型作为子范围。由于语言的技术限制,Cardinal 是 Delphi 3 中的签名类型。Delphi 4 引入了 Int64,并且 Cardinal 被设为该类型的无符号子范围(然后限制是它不是无符号的 64 位类型)。

简而言之,你从来没有得到真正的无符号行为。现在您已经升级了,您已经暴露了代码中一直存在的长期存在的问题。

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

于 2012-12-20T13:12:49.400 回答