Type Range Format
-------- ----------------------- ---------------
Integer –2147483648..2147483647 signed 32-bit
Cardinal 0..4294967295 unsigned 32-bit
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
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
6条答案
按热度按时间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来处理任何需要整型的东西,对于它们来说,大小并不重要,例如,循环计数器等等。
yebdmbv42#
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
是合适的。当然,这是对您的一般问题的一般回答。bqf10yzr3#
我建议您查看 Delphi 文档以获得最佳解释:http://docwiki.embarcadero.com/RADStudio/XE5/en/Delphi_Data_Types
dwthyt8l4#
短版本
长答案
我们都知道他们应该做什么:
但他们没有这么做。所以我们就这样了。
假定
Int32
将总是 * 有符号32位整数 *;但保证以前也被打破过。额外阅读
奖励聊天
来自Delphi 5帮助:
整数类型
整数类型表示整数的子集。一般整数类型是 * Integer * 和 * Cardinal *;尽可能的使用它们,因为它们能为底层CPU和操作系统带来最佳性能。2下表给出了当前32位Object Pascal编译器的范围和存储格式。
基本整数类型包括 * Shortint 、 Smallint 、 Longint 、 Int64 、 Byte 、 Word * 和 * Longword *。
通常,对整数的算术运算返回类型为 * Integer * 的值,在当前实现中,该类型等效于32位的 * Longint 。仅当对 * Int64 * 操作数执行运算时,运算才会返回类型为 * Int64 * 的值。
请注意,在当前实现中,"等同于Longint"*。当时的想法是
Integer
将发生变化;他们几乎没有意识到将要改变的是Longint
。来自Delphi 1用户指南:
数据类型
Object Pascal在语言中内置了几种数据类型。您可以创建这些预定义类型中任何一种的变量。下表列出了预定义的数据类型:
来自Delphi XE6帮助:
整数类型=============
整数类型表示整数的子集。
整数类型可以与平台相关,也可以与平台无关。
平台相关整数类型
与平台相关的整数类型经过转换以适应当前编译器平台的位大小。与平台相关的整数类型为NativeInt和NativeUInt。尽可能使用这些类型是可取的,因为它们可以为基础CPU和操作系统带来最佳性能。下表说明了它们在Delphi编译器中的范围和存储格式。
与平台无关的整数类型始终具有相同的大小,与您使用的平台无关。与平台无关的整数类型包括ShortInt、SmallInt、LongInt、Integer、Int64、Byte、Word、LongWord、Cardinal和UInt64。
注意
Integer
和Cardinal
是如何被记录为平台依赖的吗?还注意LongInt
和LongWord
是如何被记录为平台独立的吗?3xiyfsfu5#
Integer
是32位有符号整数类型-Longint
是此类型的别名。Cardinal
是32位无符号整数类型-LongWord
和DWORD
是此类型的别名。kq0g1dla6#
以前有
fundamental
整数类型(不应该改变)和generic types
,理论上不同的平台可以有不同的整数类型,虽然整数类型实际上从来没有改变过,现在在XE6的文档中,整数类型有了更逻辑、简单和清晰的定义,并且只有两种平台依赖的整数类型:所有其他整数类型都与平台无关:
有关详细信息,我建议阅读帮助的“简单类型”部分。