gpt4 book ai didi

delphi - Delphi 的基本类型如何相互关联?

转载 作者:行者123 更新时间:2023-12-03 14:38:45 26 4
gpt4 key购买 nike

Delphi 长期以来一直支持一些基本的数字类型,我想知道它们之间是如何相关的。

在 Delphi 2007 中我发现了这些声明(有些是冲突的,有些只是别名):

类型.pas:

DWORD = LongWord;
Largeint = Int64;

getmem.inc:

DWORD = Integer;

Windows.pas:

DWORD = Types.DWORD;
SHORT = Smallint;
UINT = LongWord;
ULONG = Cardinal;
LONGLONG = Int64;
TLargeInteger = Int64;
ULONGLONG = UInt64;

这让我想到基本的有符号数字类型是 SmallInt、Integer 和 Int64。无符号,有 Byte、WORD 和 UInt64。但是 Cardinal 和 LongWord 有什么区别呢? (顺便问一下,这些类型的原始外壳和预期外壳是什么?)

是否存在有符号 8 位整数 (Int8) 的类型?

// Int8 = ?unknown?;
UInt8 = Byte;
Int16 = SmallInt;
UInt16 = Word;
Int32 = Integer;
UInt32 = LongWord;
// Int64 already exists
// UInt64 already exists

最后,我应该如何定义 Int 和 UInt,特别是在 C/C++ 兼容性和 future 切换到其他平台(也可能是 64 位)方面? (当然,一个相关的问题是,在 64 位 Delphi 中如何定义各种数值类型?)

最佳答案

带符号的一字节整数类型是ShortInt。您可以记住它的大小,因为它与 short 类型的通常 C 实现的大小不同。

关于大小写,第一个字母大写。 The documentation倾向于将末尾的“int”部分保留为小写,如Longint,但我认为将其大写更常见。不要将类型全部大写,除非您使用 Platform SDK 类型并且您希望代码显示其 C 根源;否则我只会写 WordDWordLongULong 等)

Delphi 2009(也许更早)已经定义了类似 Int8 的类型和UInt32 。至于如何定义IntUInt,我会说不要。您使用的语言已经定义了IntegerCardinal;不必要时不要引入新的类型名称。保留你已有的名字,然后其他人就会知道你在说什么。 (此外,Int 已经是系统单元中的一个函数。)

当您想要无符号类型并且不关心其大小时,请使用Cardinal;当变量必须正好是四个字节时,请使用LongWord。对于 IntegerLongInt 也是如此。 当您需要四字节无符号类型时,请使用 Cardinal;当您想要通用无符号类型并且不关心大小时,请使用LongWord。如今,IntegerLongInt 也是如此。如果您正在编写 16 位代码,则在需要 4 个字节时使用 LongInt,在不关心大小时使用 IntegerCardinalLongWord 在 Delphi 和 Turbo Pascal 的 16 位时代并不存在。

多年来的普遍看法是,IntegerCardinal 在 64 位编译器上将成为 64 位类型,但事实显然并非如此。相反,they will remain 32-bit types ,就像 Microsoft C++ 中的对应项一样。此外,还会有一个新类型 NativeInt,它在 64 位编译器中将是 64 位类型。 LongIntLongWord 类型将成为 64 位类型,因为它们始终与 Pointer 类型大小相同,后者甚至是 32 位16 位时间。

关于delphi - Delphi 的基本类型如何相互关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/997795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com