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

jus*_*tyy 8 delphi

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

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

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

Rud*_*uis 8

简而言之:Longint和Longword是固定大小的整数,前者是有符号的,后者是无符号的,并且通常都是32位大小.它们的大小在XE8中依赖于平台,但在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被认为是固定大小,我越来越倾向于使用(U)像UInt16或Int32这样的IntXX版本.一个例外是我使用Byte,我无法想象它会改变它的大小(1).

当然,我会将Integer和Cardinal用于任何需要整数类型的东西,其大小不是那么重要,例如对于循环计数器等.

  • @AndreiGalatyn这比那更复杂.在64位进程中,32位整数性能优于64位整数性能.Perf不是原因.`NativeInt`和`NativeUInt`的目的是获得与指针大小相同的整数类型.故事结局.如果在未来的某个世界中,64位整数的性能优于32位整数,那么"整数"可能会改变.或者也许`Longint`将在64位Mac/Linux上64位,以匹配平台内存模型.我不认为你可以看到未来. (2认同)
  • @Andrei:您可能看不出任何原因,但Integer通常与同一平台上其他语言的整数大小相同.如果特定(新)平台上的整数大小不是32位,则Integer的大小也可能会改变.这是通用整数类型(如Integer),固定大小整数类型(如Longint)和指针大小的整数类型(如NativeInt)之间的差异. (2认同)