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

时间:2014-07-01 10:13:34

标签: delphi

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

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

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

6 个答案:

答案 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)

  • 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时使用它。

您应该使用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位整数;但是保证以前就被打破了。

奖金阅读

奖励聊天

从Delphi 5帮助中:

整数类型


整数类型代表整数的子集。通用整数类型为 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的变化。

摘自《 Delphi 1用户指南》:

数据类型


对象Pascal具有该语言内置的几种数据类型。您可以创建以下变量 这些预定义类型中的任何一种。下表列出了预定义的数据类型:

表5.1 对象Pascal预定义的数据类型

  • 整数:不带小数部分的数字,范围为–32768至32767。需要两个字节的内存。
  • Shortint :不带小数部分的数字,范围为–128至127。仅需要一个字节的内存。
  • Longint :不带小数部分的数字,范围为–2147483647至2147483647。需要四个字节的内存。
  • Byte :不带小数部分的数字,范围为0到255。需要一个字节的内存。
  • 单词:不带小数部分的数字,范围为0到65535。需要两个字节的内存

从Delphi XE6帮助中:

整数类型 ================

整数类型代表整数的子集。

整数类型可以与平台有关,也可以与平台无关。

平台相关的整数类型


依赖于平台的整数类型被转换为适合当前编译器平台的位大小。平台相关的整数类型为 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 

请注意,IntegerCardinal如何被记录为与平台相关的文件?还要注意如何将LongIntLongWord记录为独立平台?

答案 4 :(得分:-1)

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

答案 5 :(得分:-1)

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

NativeInt
NativeUInt

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

ShortInt 
SmallInt 
LongInt 
Integer 
Int64 
Byte 
Word 
LongWord 
Cardinal 
UInt64 

有关详细信息,我建议您阅读"简单类型"帮助部分。