Подтвердить что ты не робот

Как основные типы Delphi связаны друг с другом?

Delphi уже давно поддерживает несколько базовых числовых типов, и мне было интересно, как они связаны друг с другом.

В Delphi 2007 я нашел эти объявления (некоторые конфликтуют, некоторые из них являются просто aliasses):

Types.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. Но в чем разница между кардиналом и Лонгвором? (Кстати, какой исходный и предназначенный для этих типов корпус?)

И есть ли тип для подписанных 8-битных целых чисел (Int8)?

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

Наконец, как мне определить Int и UInt, особенно в отношении совместимости с C/С++ и будущего перехода на другие платформы (возможно, также на 64 бит)? (Связанный с этим вопрос, конечно, каким образом будут определены различные числовые типы в 64-разрядном Delphi?)

4b9b3361

Ответ 1

Подписанный однобайтовый целочисленный тип ShortInt. Вы можете запомнить его размер за счет того, что он не совпадает с обычными реализациями C типа short.

Что касается капитализации, запишите первую букву. Документация имеет тенденцию оставлять часть "int" в конце нижнего регистра, как в Longint, но я думаю, что это более распространено для ее использования. Не записывайте типы во всех столицах, если вы не используете типы Platform SDK, и вы хотите, чтобы ваш код показывал свои корни C; иначе я просто напишу Word и DWord, Long и ULong и т.д.)

Delphi 2009, возможно, ранее, уже определяет такие типы, как Int8 и UInt32. Что касается определения Int и UInt, я бы сказал, нет. Язык, который вы используете, уже определяет Integer и Cardinal; не вводите новые имена типов, когда вам это не нужно. Сохраните имена, которые у вас уже есть, и тогда все остальные узнают, о чем вы говорите. (Кроме того, Int уже является функцией в системном блоке.)

Используйте Cardinal, если вам нужен неподписанный тип и не заботитесь о его размере; используйте LongWord, когда переменная должна быть ровно четырьмя байтами. Аналогично для Integer и LongInt. Используйте Cardinal, если вам нужен четырехбайтовый неподписанный тип; используйте LongWord, если вам нужен общий неподписанный тип и не заботятся о размере. Аналогично для Integer и LongInt, в настоящее время. Если вы пишете 16-битный код, используйте LongInt, когда вам нужно четыре байта, и используйте Integer, когда вам не нужен размер; Cardinal и LongWord не существовало в 16-битных днях Delphi и Turbo Pascal.

Общая мудрость в течение многих лет заключалась в том, что Integer и Cardinal станут 64-битными типами в 64-разрядном компиляторе, но это, по-видимому, не так. Вместо этого они останутся 32-битными типами, как и их аналоги в Microsoft С++. Кроме того, будет новый тип NativeInt, который будет 64-разрядным типом в 64-битном компиляторе. Типы LongInt и LongWord станут 64-битными типами, потому что они всегда были того же размера, что и тип Pointer, который был 32 бит даже в 16-битные времена.

Ответ 2

UInt8 = Byte
Int8 = ShortInt
UInt16 = Word
Int16 = SmallInt
UInt32 = LongWord
Int32 = LongInt
UInt64 = UInt64
Int64 = Int64

int = Integer
uint = Cardinal

NativeInt (generic, depends on CPU register size)
NativeUInt (generic, depends on CPU register size)

Кардинал и Целое - это общие типы. Для 16 бит они были 16 байт большими, а для 32 бит - 32 бит. Для 64-битной платформы Windows 64bit (LLP64) определяет их как 32 бит. Новые типы NativeInt и NativeUInt теперь представляют собой типы регистров процессора.

Ответ 3

Кардинал и Целое - это псевдонимы.

Cardinal ==> LongWord  (unsigned)
Integer  ==> LongInt   (signed)

http://i38.tinypic.com/9s5ufc.jpg

Ответ 4

Чтобы получить "исходный и предполагаемый корпус", нажмите Ctrl - Space, Return после ввода имени типа (например, использование кода).