基本的Delphi类型如何相互关联?

时间:2009-06-15 19:05:02

标签: delphi types

Delphi长期以来支持一些基本的数字类型,我想知道它们是如何相互关联的。

在Delphi 2007中,我发现了这些声明(有些是冲突的,有些只是别名):

Types.pas:

DWORD = LongWord;
Largeint = Int64;

getmem.inc:

DWORD = Integer;

Windows.pas:

DWORD = Types.DWORD;
SHORT = Smallint;
UINT = LongWord;
ULONG = Cardinal;
LONGLONG = Int64;
TLargeInteger = Int64;
ULONGLONG = UInt64;

这让我想到基本签名数字类型是SmallInt,Integer和Int64。无符号,有Byte,WORD和UInt64。但Cardinal和LongWord有什么区别? (顺便说一下,这些类型的原始和预期的外壳是什么?)

是否有一个带符号8位整数的类型(Int8)?

// Int8 = ?unknown?;
UInt8 = Byte;
Int16 = SmallInt;
UInt16 = Word;
Int32 = Integer;
UInt32 = LongWord;
// Int64 already exists
// UInt64 already exists

最后,我应该如何定义Int和UInt,特别是关于C / C ++兼容性以及将来切换到其他平台(可能还有64位)? (当然,一个相关的问题是如何在64位Delphi中定义各种数字类型?)

4 个答案:

答案 0 :(得分:7)

带符号的单字节整数类型为ShortInt。您可以通过 short类型的常规C实现相同的大小来记住它的大小。

资本化,首字母大写。 The documentation倾向于将“int”部分留在末尾小写,如 Longint ,但我认为将其大写更为常见。除非您使用Platform SDK类型,否则不要在所有大写中编写类型,您希望代码显示其C根;否则我只会写WordDWordLongULong等。)

Delphi 2009,也许更早,已经定义了Int8UInt32等类型。至于如何定义IntUInt,我会说。您使用的语言已定义IntegerCardinal;不必要时不要引入新的类型名称。保留你已有的名字,然后其他人都会知道你在说什么。 (此外,Int已经是系统单元中的一个函数。)

如果您想要无符号类型并且不关心其大小,请使用Cardinal;当变量必须恰好是四个字节时,请使用LongWord。同样适用于IntegerLongInt当您需要四字节无符号类型时,请使用Cardinal;如果需要通用的无符号类型而不关心大小,请使用LongWord。现在同样适用于IntegerLongInt。如果您正在编写16位代码,请在需要四个字节时使用LongInt,在不关心大小时使用Integer; Delphi和Turbo Pascal的16位日期中不存在CardinalLongWord

多年来的共同智慧是IntegerCardinal在64位编译器上将成为64位类型,但显然并非如此。相反,they will remain 32-bit types,就像他们在Microsoft C ++中的对应物一样。此外,将有一个新类型NativeInt,它将是64位编译器中的64位类型。 LongIntLongWord类型将成为64位类型,因为它们始终与Pointer类型相同,即使在16位时也是32位。

答案 1 :(得分:4)

UInt8 = Byte
Int8 = ShortInt
UInt16 = Word
Int16 = SmallInt
UInt32 = LongWord
Int32 = LongInt
UInt64 = UInt64
Int64 = Int64

int = Integer
uint = Cardinal

NativeInt (generic, depends on CPU register size)
NativeUInt (generic, depends on CPU register size)

Cardinal和Integer是通用类型。对于16位,它们是16字节大,而对于32位,它们是32位大。对于64位,Windows 64位平台(LLP64)将它们定义为32位。新的NativeInt和NativeUInt类型现在是CPU寄存器大小的类型。

答案 2 :(得分:3)

Cardinal和Integer是别名。

Cardinal ==> LongWord  (unsigned)
Integer  ==> LongInt   (signed)

答案 3 :(得分:2)

要获得“原始和预期的套管”,请在键入类型名称后按 Ctrl - 空格返回(即使用代码完成)。