Delphi长期以来支持一些基本的数字类型,我想知道它们是如何相互关联的.
在Delphi 2007中,我发现了这些声明(有些是冲突的,有些只是别名):
Types.pas:
DWORD = LongWord;
Largeint = Int64;
Run Code Online (Sandbox Code Playgroud)
getmem.inc:
DWORD = Integer;
Run Code Online (Sandbox Code Playgroud)
Windows.pas:
DWORD = Types.DWORD;
SHORT = Smallint;
UINT = LongWord;
ULONG = Cardinal;
LONGLONG = Int64;
TLargeInteger = Int64;
ULONGLONG = UInt64;
Run Code Online (Sandbox Code Playgroud)
这让我想到基本签名数字类型是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
Run Code Online (Sandbox Code Playgroud)
最后,我应该如何定义Int和UInt,特别是关于C/C++兼容性以及将来切换到其他平台(可能还有64位)?(当然,一个相关的问题是如何在64位Delphi中定义各种数字类型?)
带符号的一字节整数类型是ShortInt.您可以通过一个事实,即它的记住它的大小不是大小与通常的C实现同一short类型.
至于大写,首字母大写.文档倾向于将"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,并在不关心大小时使用; Cardinal并LongWord没有在德尔福和Turbo Pascal的16位天的存在.
多年来共同的看法是,大家Integer并Cardinal会成为在64位编译器的64位类型,但显然并非如此.相反,它们将保持32位类型,就像它们在Microsoft C++中的对应物一样.此外,将有一个新类型,NativeInt在64位编译器中将是64位类型.的LongInt和LongWord类型将成为64位的类型,因为他们一直尺寸为相同的Pointer类型,这是甚至32个比特在16比特时间.
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)
Run Code Online (Sandbox Code Playgroud)
Cardinal 和 Integer 是泛型类型。对于 16 位,它们是 16 字节大,对于 32 位,它们是 32 位大。对于 64 位,Windows 64 位平台 ( LLP64 ) 将它们定义为 32 位。新的 NativeInt 和 NativeUInt 类型现在是 CPU 寄存器大小的类型。