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中定义各种数字类型?)
答案 0 :(得分:7)
带符号的单字节整数类型为ShortInt
。您可以通过 与short
类型的常规C实现相同的大小来记住它的大小。
资本化,首字母大写。 The documentation倾向于将“int”部分留在末尾小写,如 Longint ,但我认为将其大写更为常见。除非您使用Platform SDK类型和,否则不要在所有大写中编写类型,您希望代码显示其C根;否则我只会写Word
和DWord
,Long
和ULong
等。)
Delphi 2009,也许更早,已经定义了Int8
和UInt32
等类型。至于如何定义Int
和UInt
,我会说不。您使用的语言已定义Integer
和Cardinal
;不必要时不要引入新的类型名称。保留你已有的名字,然后其他人都会知道你在说什么。 (此外,Int
已经是系统单元中的一个函数。)
如果您想要无符号类型并且不关心其大小,请使用当您需要四字节无符号类型时,请使用Cardinal
;当变量必须恰好是四个字节时,请使用LongWord
。同样适用于Integer
和LongInt
。Cardinal
;如果需要通用的无符号类型而不关心大小,请使用LongWord
。现在同样适用于Integer
和LongInt
。如果您正在编写16位代码,请在需要四个字节时使用LongInt
,在不关心大小时使用Integer
; Delphi和Turbo Pascal的16位日期中不存在Cardinal
和LongWord
。
多年来的共同智慧是Integer
和Cardinal
在64位编译器上将成为64位类型,但显然并非如此。相反,they will remain 32-bit types,就像他们在Microsoft C ++中的对应物一样。此外,将有一个新类型NativeInt
,它将是64位编译器中的64位类型。 LongInt
和LongWord
类型将成为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)
答案 3 :(得分:2)
要获得“原始和预期的套管”,请在键入类型名称后按 Ctrl - 空格,返回(即使用代码完成)。