gpt4 book ai didi

delphi - 为什么 Delphi 和 Free Pascal 通常更喜欢有符号整数数据类型而不是无符号整数数据类型?

转载 作者:行者123 更新时间:2023-12-03 14:35:04 25 4
gpt4 key购买 nike

我不是 Pascal 新手,但到现在我还是不知道为什么 DelphiFree Pascal通常将参数和返回值声明为有符号整数,而我认为它们应该始终为正数。例如:

  • Pos() 返回 Integer 类型。有可能是负数吗?
  • SetLength()NewLength 参数声明为 Integer 类型。字符串长度是否为负数?
  • System.THandle 声明为 Longint。句柄是否有负数?

有很多类似 Delphi 和 Free Pascal 中的决策。这背后有何考虑?

最佳答案

在 Pascal 中,Integer(有符号)是基本类型。所有其他整数类型都是整数的子范围。 (这在 Borland 方言中并不完全正确,考虑到 TP 中的 longint 和 Delphi 中的 int64,但足够接近)。

一个重要原因是,如果计算的中间结果为负数,并且您使用无符号整数进行计算,则会触发范围检查错误,并且由于大多数较旧的编程语言不假设 2-complete 整数,因此结果(带有范围)检查)甚至可能已损坏。

THandle 的情况要简单得多。 Delphi 在 D4 之前没有正确的 32 位无符号数,而只有 31 位基数。 (由于32位无符号整数不是整数的子范围,所以后来的无符号整数是int64的子集,这将问题转移到了uint64上,uint64是D2010左右才添加的)

因此,在 header 中的许多地方,winapi 使用无符号类型的地方都使用了有符号类型,这可能是为了避免第 32 位在这些版本中意外损坏,从而导致自定义卡住。

但是winapi的情况与一般情况不同。

稍后添加 一些 Pascal(和 Modula2/3)实现通过将整数设置为大于字长的大小来规避此陷阱,并要求声明所有数字类型一个真子范围,如下面的程序。

第一个假设主要假设所有内容都是整数的子集,第二个允许编译器再次缩小几乎所有内容以适应寄存器,特别是如果 CPU 有一些大于字操作的操作。 (类似于 x86,其中 32 位 * 32 位 mul 给出 64 位结果,或者可以使用状态位检测字长溢出(例如,在不执行完整 2*字长加法的情况下生成加法的范围异常)

   var x : 0..20;
y : -10..10;

begin
// any expression of x and y has a range -10..20

Turbo Pascal 和 Delphi 模拟其 16 位和 32 位产品的字长两倍的整数类型。最高无符号类型的处理充其量只是hacky。

关于delphi - 为什么 Delphi 和 Free Pascal 通常更喜欢有符号整数数据类型而不是无符号整数数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12781434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com