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

基本的Delphi类型是如何相互关联的?,delphi,types,Delphi,Types,Delphi长期以来一直支持一些基本的数字类型,我想知道它们之间是如何相互关联的 在Delphi 2007中,我发现这些声明(有些相互冲突,有些只是别名): 类型.pas: DWORD = LongWord; Largeint = Int64; getmem.inc: DWORD = Integer; Windows.pas: DWORD = Types.DWORD; SHORT = Smallint; UINT = LongWord; ULONG = Cardinal; LONGLONG

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

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

类型.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。无符号,有字节、字和UInt64。但是Cardinal和LongWord之间有什么区别呢?(顺便问一下,这些类型的原始和预期外壳是什么?)

有符号8位整数(Int8)的类型吗

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


基数和整数是泛型类型。对于16位,它们是16字节大,对于32位,它们是32位大。对于64位,Windows 64位平台()将其定义为32位。新的NativeInt和NativeUInt类型现在是CPU寄存器大小的类型。

有符号单字节整数类型是
ShortInt
。您可以记住它的大小,因为它与
short
类型的常规C实现的大小不同

至于大写,请将第一个字母大写。倾向于在末尾将“int”部分保留为小写,就像在Longint中一样,但我认为更常见的是将其大写。除非您使用的是平台SDK类型,并且希望代码显示其C根,否则不要使用所有大写字母编写类型;否则我就写
Word
DWord
Long
ULong
,等等。)

Delphi2009,也许更早,已经定义了和这样的类型。至于如何定义
Int
UInt
,我想说不要。您正在使用的语言已经定义了
整数
基数
;不必引入新类型名称时,不要引入新类型名称。保留你已有的名字,然后其他人就会知道你在说什么。(此外,已是系统单元中的一项功能。)

当您想要一个无符号类型,而不关心其大小时,请使用
Cardinal
;当变量必须正好为四个字节时,请使用
LongWord
。同样适用于
整数
。如果需要四字节无符号类型,请使用
Cardinal
;如果您想要一个通用的无符号类型,而不关心大小,请使用
LongWord
。如今,对于
整数
也是如此。如果您正在编写16位代码,则在需要四个字节时使用
LongInt
,在不关心大小时使用
Integer
Cardinal
LongWord
在Delphi和TurboPascal的16位时代不存在


多年来,人们普遍认为在64位编译器上,
Integer
Cardinal
将成为64位类型,但情况显然并非如此。相反,就像微软C++中的对应程序一样。此外,还将有一个新类型,
NativeInt
,它将是64位编译器中的64位类型。
LongInt
LongWord
类型将成为64位类型,因为它们始终与
指针
类型大小相同,即使在16位时间内也是32位。

基数和整数是别名

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

要获取“原始和预期的大小写”,请按Ctrl空格键,在键入类型名称后返回(即使用代码补全)。

“LongInt和LongWord类型将变为64位类型”。这是讨论过的问题,但没有达成一致意见,特别是因为自TurboPASCAL时代以来,它们被宣传为非通用32位类型。16位的指针,其中20位大而不是32位:“(Seg16指针是32位的,在SizeOf(指针)=4的意义上。SizeOf(指针)=2.5…从来都不是这种情况,整数在TP中是16位的。我怀疑longint(和longword)将是64位的。现在大多数操作系统是LP64或LLP64,而不是ILP64。尽管一些更罕见的操作系统(AIX iirc)是。嘿,我刚从CodeGear员工艾伦·鲍尔在我链接的新闻组帖子中写的内容开始。安德烈亚斯显然也为CodeGear工作,所以他比我更清楚到底发生了什么(这显然还不算什么)。如果LongInt是64位,Integer保持在32位,那么这就是LP64。我现在知道ILP64不是很流行,但我认为几年来,大多数人自然会期望Delphi的Integer增长到64位,就像它以前增长到32位一样。(维基百科说AIX是LP64。)感谢您提到LLP64,这让我读到了这篇文章:令人惊讶的是,有多少东西可以忘记…;-)FPC将64位无符号定义为QWORD。错了!LongWord=cardinal=DWORD=unsigned 32位整数,哎呀,中间名颠倒了(修复了)。外部想法是正确的,
Integer
Int32
的别名,
Cardinal
UInt32
的别名(使用更清晰的.NET术语)感谢所有的评论-我从中了解到,像UInt8这样的基本类型和所有变体都应该被用作基本类型!如果将来有一个Delphi(或FPC),那就太好了版本改变了它的类型声明,因此不太基本的类型显然是从基础派生的。我希望在types.pas或System.pas中看到类似的内容:type Integer={$IFDEF CPU64}Int64{$ELSE}Int32{$ENDIF};不过我只需要5美分。
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 ==> LongWord  (unsigned)
Integer  ==> LongInt   (signed)