我有一个程序在Delphi 3中运行正常,我在Turbo Delphi 2006上编译和测试并发现了一个问题。问题是:我使用“基数”数据类型作为某种东西的索引。它在Delphi 3中有效,但我发现Turbo Delphi 2006编译版本的值大于128-256左右,具体取决于具体的数据。将这些数据类型更改为“longint”修复了问题,以便程序与两个编译器一起正常工作。
问题:为什么会这样?
我的理解是Cardinal数据类型只是典型的无符号整数数据。这与它们在这个程序中的应用是一致的,特别是通过Delphi 3编译正常工作的事实证明了这一点。那么为什么Turbo Delphi 2006编译不起作用呢?
答案 0 :(得分:5)
在Delphi中,无符号类型只是下一个较大的有符号类型的子范围类型。在Delphi 3中,没有64位类型,因此Cardinal没有下一个更大的类型作为子范围。 Cardinal是Delphi 3中的签名类型,因为该语言存在技术限制。 Delphi 4引入了Int64,而Cardinal被认为是该类型的无符号子范围(然后限制是没有无符号的64位类型)。
简而言之,您从未获得真正的无符号行为。现在您已经升级了,您已经暴露了代码中一直存在的长期存在的问题。
您的代码编译不能证明您的代码是正确的。 Delphi 3不能强制执行需要它实际上没有的类型的规则。