在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.无符号,有字节,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中如何定义各种数值类型?)
解决方法
关于资本化,首字母大写. The documentation倾向于将“int”部分放在小写字母的末尾,就像在Longint中一样,但是我认为更常见的是使用它.除非您使用Platform SDK类型,并且希望您的代码显示其C根,否则不要在所有资本中编写类型;否则我会写Word和DWord,Long和ULong等)
Delphi 2009,也许更早,已经定义了像Int8
和UInt32
这样的类型.关于如何定义Int和UInt,我会说不要.您使用的语言已经定义了整数和基数;不要引入新的类型名称.保留你已经拥有的名字,然后其他人都会知道你在说什么. (此外,Int
已经是系统单元中的功能.)
当你想要一个无符号的类型并且不关心它的大小时使用红衣主教;当变量必须正好是四个字节时使用LongWord.对于整数和长整型也是如此.当您想要一个四字节无符号类型时使用红衣主教;当您想要一个通用的无符号类型并且不关心大小时使用LongWord.同样对于整数和LongInt,如今.如果你正在编写16位代码,当你需要四个字节时使用LongInt,当你不在乎大小时使用整数;在Delphi和Turbo Pascal的16位日子里,红衣主教和LongWord并不存在.
多年来的共同智慧是,整数和Cardinal将在64位编译器上成为64位类型,但显然不是这样.相反,they will remain 32-bit types,就像他们在微软C的同行一样.此外,将有一种新型的NativeInt,它将是64位编译器中的64位类型. LongInt和LongWord类型将成为64位类型,因为它们始终与指针类型相同,即使在16位时也是32位.