【问题标题】:Why has the Cardinal type in my application changed?为什么我的应用程序中的 Cardinal 类型发生了变化?
【发布时间】:2012-12-20 12:59:53
【问题描述】:

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

问题:为什么会这样?

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

【问题讨论】:

  • 没有代码很难提供帮助
  • 问题已解决,因此没有真正的问题需要代码提供帮助。我只是想知道为什么我观察我所做的事情。我相信答案如下。

标签: delphi delphi-2006 delphi-3


【解决方案1】:

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

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

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

【讨论】:

  • 我一点也不明白。什么是 UInt64?它如何解释报告的行为?
  • @David,UInt64 是一种直到最近才存在的类型。当 Delphi 版本是个位数(可能更高版本)时,无符号类型是较大有符号类型的子范围:要存在 UInt64,还需要有 Int128 类型。我不确定在现代版本中是否仍然如此。
  • 没有 Int128。但是 UInt64 存在。但我还是不明白你在说什么。我在哪里可以了解更多信息?
  • @DavidHeffernan - Cardinal 在 Delphi 2-3 中是 31 位类型
  • @David,这是我十年前在新闻组中学到的东西,所以请查看新闻组档案,如果它们可以追溯到那么远。我不知道它当前记录在哪里,甚至它是否仍然是对编译器内部如何表示无符号类型的准确描述。不过,对于我谈到的版本来说,这绝对是正确的。 Delphi 4 没有 UInt64 类型,尽管有一些用于无符号 64 位算术的内部库函数(例如,lludiv);它们只是没有在语言级别上公开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 2021-07-26
  • 2013-05-13
相关资源
最近更新 更多