delphi LongInt与整数、长字与基数的区别

sqyvllje  于 2023-02-04  发布在  其他
关注(0)|答案(6)|浏览(436)

在 Delphi 中,LongInt和Integer、LongWord和Cardinal之间有什么区别?
有时我发现DWORD的用法,它是什么?
它们在所有版本的 Delphi 中一致吗?我应该坚持哪一个?

pzfprimi

pzfprimi1#

简而言之:Longint和Longword是固定大小的整数,前者有符号,后者无符号,通常都是32位大小。它们的大小在XE8中是平台相关的,但在XE7和更早的版本中是固定大小(32位)。
Integer和Cardinal不是固定大小的。它们是所谓的"泛型"整数(不要将其与泛型混淆,后者是另一种情况),也就是说,当需要整数类型时,无论大小如何,都应该优先使用它们。根据版本和平台的不同,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被认为是固定大小的,我越来越倾向于使用(U)IntXX版本,如UInt16或Int32。一个例外是我使用的Byte,我无法想象它会改变大小(1)。
当然,我将使用Integer和Cardinal来处理任何需要整型的东西,对于它们来说,大小并不重要,例如,循环计数器等等。

yebdmbv4

yebdmbv42#

  • 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是合适的。当然,这是对您的一般问题的一般回答。

dwthyt8l

dwthyt8l4#

短版本

| 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和操作系统带来最佳性能。2下表给出了当前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用户指南:

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

    • 表5.1**对象Pascal预定义数据类型
    • 整数 *:不带小数部分的数字,范围在-32768到32767之间。需要两个字节的内存。
    • Shortint *:不带小数部分的数字,范围在-128到127之间。仅需要一个字节的内存。
    • Longint *:不带小数部分的数字,范围在-2147483647到2147483647之间。需要四个字节的内存。
    • 字节 *:不带小数部分的数字,范围在0到255之间。需要一个字节的内存。
    • Word *:不带小数部分的数字,范围在0到65535之间。需要两个字节的内存

来自Delphi XE6帮助:

整数类型=============
整数类型表示整数的子集。
整数类型可以与平台相关,也可以与平台无关。
平台相关整数类型
与平台相关的整数类型经过转换以适应当前编译器平台的位大小。与平台相关的整数类型为NativeIntNativeUInt。尽可能使用这些类型是可取的,因为它们可以为基础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
    • 与平台无关的整数类型**

与平台无关的整数类型始终具有相同的大小,与您使用的平台无关。与平台无关的整数类型包括ShortIntSmallIntLongIntIntegerInt64ByteWordLongWordCardinalUInt64

    • 与平台无关的整数类型**
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是如何被记录为平台独立的吗?

3xiyfsfu

3xiyfsfu5#

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

kq0g1dla

kq0g1dla6#

以前有fundamental整数类型(不应该改变)和generic types,理论上不同的平台可以有不同的整数类型,虽然整数类型实际上从来没有改变过,现在在XE6的文档中,整数类型有了更逻辑、简单和清晰的定义,并且只有两种平台依赖的整数类型:

NativeInt
NativeUInt

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

ShortInt 
SmallInt 
LongInt 
Integer 
Int64 
Byte 
Word 
LongWord 
Cardinal 
UInt64

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

相关问题