在Delphi中,LongInt和Integer,LongWord和Cardinal有什么区别?
有时我会发现DWORD的用法,它是什么?
在所有版本的Delphi中它们是否一致?我应该坚持哪一个?
答案 0 :(得分:8)
简而言之:Longint和Longword是固定大小的整数,前者是有符号的,后者是无符号的,并且通常都是32位大小。 XE8中的Their size is platform-dependent,但XE7及更早版本中的固定大小(32位)。
整数和红衣主教的大小不固定。他们被称为"泛型"整数(不要将它与泛型,这是一双不同的鞋子混淆),即当需要整体类型时,无论大小如何,它们都应该优先使用。根据版本和平台,Integer和Cardinal的大小可能不同。目前,它们的大小和类型与Longint和Longword相同。
固定尺寸类型的尺寸在版本或平台之间不同。您应该使用这些类型,您必须与自己的程序之外的其他来源的代码或数据进行交互,换句话说,确切的二进制兼容性很重要,例如,调用API函数时。因此使用像DWORD等类型
请注意,当前版本具有Byte或Smallint等类型的别名。它们是Int8,UInt8,Int16,UInt16等......直到UInt64。 ISTM,这些名称比以下更容易记住" SMALLINT" (16位签名)或" Shortint" (8位签名)。
因此,只要可能,就使用Integer和Cardinal,因为这些可能是平台和版本的理想类型。使用固定大小的类型,如Byte,Smallint,Longint或UInt64,仅举几例,当需要与其他数据完全二进制兼容时。
由于存在一些混淆(见顶部附近的链接),并且因为现在不再将Longint和Longword视为固定大小的平台独立,但是,奇怪的是,Integer和Cardinal被认为是固定大小,我越来越倾向于使用UInt16或Int32等(U)IntXX版本。一个例外是我使用Byte,我无法想象它会改变它的大小(1)。
当然,我会使用整数和红衣主教来做任何需要整体类型的东西,其大小不是那么重要,例如: for循环计数器等
答案 1 :(得分:3)
Integer
是底层平台的C ++ int
。 LongInt
是底层平台的C ++ long int
。 Cardinal
是底层平台的C ++ unsigned int
。 LongWord
是底层平台的C ++ unsigned long int
。 所有这四种类型都依赖于平台。
在撰写本文时,在所有支持的平台上,Integer
和Cardinal
都是32位类型。这些类型是依赖于平台的,所以在所有支持的平台上,类型大小相同。
在64位* nix平台上,LongInt
和LongWord
是64位类型。在所有其他支持的平台上,在编写本文时,类型是32位类型。
关键是这些类型都依赖于平台。
DWORD
是Windows API使用的类型别名。仅在使用该API时使用它。
您应该使用Integer
还是LongInt
?这取决于你的用途。通常,对于互操作,使用与C ++代码匹配的任何类型。否则,对于大多数用途Integer
是合适的。当然,这是对您的一般问题的通用答案。
答案 2 :(得分:1)
我建议您查看Delphi文档以获得最佳解释:http://docwiki.embarcadero.com/RADStudio/XE5/en/Delphi_Data_Types
答案 3 :(得分:0)
| Type | 16-bit platform | 32-bit platform | 64-bit platform |
|-------------|-----------------|---------------- |------------------|
| Integer | 16-bit signed | 32-bit signed | "generic type"
| Cardinal | 16-bit unsigned | 32-bit unsigned | "generic type"
| Longint | 32-bit signed | 32-bit signed | 64-bit signed | "fundamental type"
| Longword | n/a | 32-bit unsigned | 64-bit unsigned | "fundamental type"
| Int64 | n/a | 64-bit signed | 64-bit signed | "fundamental type"
| UInt64 | n/a | 64-bit unsigned | 64-bit unsigned | "fundamental type"
| Int32 | n/a | 32-bit signed |
| UInt32 | n/a | 32-bit unsigned |
| NativeInt | n/a | 32-bit signed | 64-bit signed |
| NativeUInt | n/a | 32-bit unsigned | 64-bit unsigned |
| FixedInt | n/a | 32-bit signed |
| FixedUInt | n/a | 32-bit unsigned |
我们都知道他们应该做什么:
| Type | 16-bit platform | 32-bit platform | 64-bit platform |
|-------------|-----------------|---------------- |------------------|
| Integer | 16-bit signed | 32-bit signed | 64-bit signed | "generic type"
| Cardinal | 16-bit unsigned | 32-bit unsigned | 64-bit unsigned | "generic type"
| SmallInt | 16-bit signed | "fundamental type"
| Word | 16-bit unsigned | "fundamental type"
| Longint | 32-bit signed | "fundamental type"
| Longword | 32-bit unsigned | "fundamental type"
| Int64 | 64-bit signed | "fundamental type"
| UInt64 | 64-bit unsigned | "fundamental type"
但这不是他们所做的。所以我们就在这里。
大概Int32
始终是一个带符号的32位整数;但是保证以前就被打破了。
整数类型
整数类型代表整数的子集。通用整数类型为 Integer 和 Cardinal ;尽可能使用它们,因为它们可以使基础CPU和操作系统获得最佳性能。下表列出了当前32位Object Pascal编译器的范围和存储格式。
Type Range Format -------- ----------------------- --------------- Integer –2147483648..2147483647 signed 32-bit Cardinal 0..4294967295 unsigned 32-bit
基本整数类型包括 Shortint , Smallint , Longint , Int64 , Byte , Word 和 Longword 。
Type Range Format -------- ----------------------- ---------------- Shortint –128..127 signed 8-bit Smallint –32768..32767 signed 16-bit Longint –2147483648..2147483647 signed 32-bit Int64 –2^63..2^63–1 signed 64-bit Byte 0..255 unsigned 8-bit Word 0..65535 unsigned 16-bit Longword 0..4294967295 unsigned 32-bit
通常,对整数的算术运算返回类型为 Integer 的值-在其当前实现中,该值等效于32位 Longint 。仅当在 Int64 操作数上执行操作时,操作才会返回类型为 Int64 的值。
请注意”在其当前实现中等效于Longint” 。当时的想法是Integer
会改变;他们几乎没有意识到会发生Longint
的变化。
数据类型
对象Pascal具有该语言内置的几种数据类型。您可以创建以下变量 这些预定义类型中的任何一种。下表列出了预定义的数据类型:
表5.1 对象Pascal预定义的数据类型
- 整数:不带小数部分的数字,范围为–32768至32767。需要两个字节的内存。
- Shortint :不带小数部分的数字,范围为–128至127。仅需要一个字节的内存。
- Longint :不带小数部分的数字,范围为–2147483647至2147483647。需要四个字节的内存。
- Byte :不带小数部分的数字,范围为0到255。需要一个字节的内存。
- 单词:不带小数部分的数字,范围为0到65535。需要两个字节的内存
整数类型 ================
整数类型代表整数的子集。
整数类型可以与平台有关,也可以与平台无关。
平台相关的整数类型
依赖于平台的整数类型被转换为适合当前编译器平台的位大小。平台相关的整数类型为 NativeInt 和 NativeUInt 。希望尽可能使用这些类型,因为它们会为基础CPU和操作系统带来最佳性能。下表说明了Delphi编译器的范围和存储格式。
与平台相关的整数类型
Type Range Format Alias ----------- ----------------------- -------------------------------------- ------------ NativeInt -2147483648..2147483647 Signed 32-bit on 32-bit platforms or Integer -2^63..2^63-1 Signed 64-bit on 64-bit platforms Int64 NativeUInt 0..4294967295 Unsigned 32-bit on 32-bit platforms or Cardinal 0..2^64-1 Unsigned 64-bit on 64-bit platforms UInt64
与平台无关的整数类型
与平台无关的整数类型始终具有相同的大小,而不管您使用什么平台。与平台无关的整数类型包括 ShortInt , SmallInt , LongInt , Integer , Int64 ,字节,单词,长单词,基数和 UInt64 。
与平台无关的整数类型
Type Range Format Alias ----------- ----------------------- --------------- ------ ShortInt -128..127 Signed 8-bit Int8 SmallInt -32768..32767 Signed 16-bit Int16 LongInt -2147483648..2147483647 Signed 32-bit Int32 Integer -2147483648..2147483647 Signed 32-bit Int32 Int64 -2^63..2^63-1 Signed 64-bit Byte 0..255 Unsigned 8-bit UInt8 Word 0..65535 Unsigned 16-bit UInt16 LongWord 0..4294967295 Unsigned 32-bit UInt32 Cardinal 0..4294967295 Unsigned 32-bit UInt32 UInt64 0..2^64-1 Unsigned 64-bit
请注意,Integer
和Cardinal
如何被记录为与平台相关的文件?还要注意如何将LongInt
和LongWord
记录为独立平台?
答案 4 :(得分:-1)
答案 5 :(得分:-1)
以前有fundamental
个整数类型(永远不应该改变)和generic types
,理论上对于不同的平台可能会有所不同,尽管整数类型实际上从未改变过。现在,在XE6的文档中,有一个更合乎逻辑,简单明了的整数类型定义,只有两个与平台相关的整数类型:
NativeInt
NativeUInt
所有其他整数类型都与平台无关:
ShortInt
SmallInt
LongInt
Integer
Int64
Byte
Word
LongWord
Cardinal
UInt64
有关详细信息,我建议您阅读"简单类型"帮助部分。