LongInt和Integer,LongWord和Cardinal之间的区别

问题描述 投票:8回答:5

在Delphi中,LongInt和Integer,LongWord和Cardinal有什么区别?

有时我会发现DWORD的用法,它是什么?

它们在所有版本的Delphi中是否一致?我应该坚持哪一个?

delphi
5个回答
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,仅举几例,当需要与其他数据完全二进制兼容时。

Update

由于存在一些混乱(见顶部附近的链接),并且从现在开始不再将Longint和Longword视为固定大小的平台独立,但是,奇怪的是,Integer和Cardinal被认为是固定大小,我越来越倾向于使用(U)像UInt16或Int32这样的IntXX版本。一个例外是我使用Byte,我无法想象它会改变它的大小(1)。

当然,我会使用整数和红衣主教来做任何需要整体类型的东西,其尺寸不是那么重要,例如:用于循环计数器等


3
投票
  • Delphi Integer是底层平台的C ++ int
  • Delphi LongInt是底层平台的C ++ long int
  • Delphi Cardinal是底层平台的C ++ unsigned int
  • Delphi LongWord是底层平台的C ++ unsigned long int

所有这四种类型都依赖于平台。

在撰写本文时,在所有支持的平台上,IntegerCardinal都是32位类型。这些类型是依赖于平台的,所以在所有支持的平台上,类型大小相同。

在64位* nix平台上,LongIntLongWord是64位类型。在所有其他支持的平台上,在编写本文时,类型是32位类型。

关键是这些类型都依赖于平台。

DWORD是Windows API使用的类型别名。仅在使用该API时使用它。

你应该使用IntegerLongInt吗?这取决于你的用途。通常,对于互操作,使用与C ++代码匹配的任何类型。否则,对于大多数用途,Integer是合适的。当然,这是对您的一般问题的通用答案。


1
投票

我建议您查看Delphi文档以获得最佳解释:http://docwiki.embarcadero.com/RADStudio/XE5/en/Delphi_Data_Types


-1
投票

Integer是一个32位有符号整数类型 - Longint是此类型的别名。 Cardinal是一个32位无符号整数类型 - LongWordDWORD是此类型的别名。


-1
投票

以前有fundamental整数类型(应该永远不会改变)和generic types,理论上可能对于不同的平台不同,尽管整数类型从未真正改变过。现在,在XE6的文档中,有一个更符合逻辑,简单和清晰的整数类型定义,并且只有两个与平台相关的整数类型:

NativeInt
NativeUInt

所有其他整数类型都与平台无关:

ShortInt 
SmallInt 
LongInt 
Integer 
Int64 
Byte 
Word 
LongWord 
Cardinal 
UInt64 

有关详细信息,建议您阅读“帮助”中的“简单类型”部分。

© www.soinside.com 2019 - 2024. All rights reserved.