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

Я выполнил дамп сборки и обнаружил разницу между двумя версиями:

@@ -11,8 +11,7 @@
pushl %ecx
subl $20, %esp
movzbl -9(%ebp), %eax
- movsbl %al,%eax
- testl %eax, %eax
+ testb %al, %al

Похоже, что последний генерирует одну инструкцию, а первый - две, но это довольно ненаучно.

Это gcc, без оптимизации:

test1.c:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{ 
  char *pointer[5];

if(pointer[0] == NULL) {
  exit(1);
}

exit(0);

}

test2.c: Измените pointer[0] == NULL на !pointer[0]

gcc -s test1.c, gcc -s test2.c, diff -u test1.s test2.s

12
задан Rob Kennedy 15 June 2009 в 20:14
поделиться

4 ответа

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

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

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

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

В течение многих лет считалось, что Integer и ] Cardinal станет 64-битным типом в 64-битном компиляторе, но, по-видимому, это не так. Вместо этого они останутся 32-битными типами , как и их аналоги в Microsoft C ++. Кроме того, появится новый тип NativeInt , который будет 64-битным типом в 64-битном компиляторе.

7
ответ дан 2 December 2019 в 20:19
поделиться
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)

Cardinal и Integer являются универсальными типами. Для 16 бит они были 16 байт, а для 32 бит - 32 бита. Для 64-битной платформы 64-битная Windows ( LLP64 ) определяет их как 32-битные. Новые типы NativeInt и NativeUInt теперь имеют размер регистра ЦП.

4
ответ дан 2 December 2019 в 20:19
поделиться

Кардинальное число и Целое число являются псевдонимами.

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

3
ответ дан 2 December 2019 в 20:19
поделиться

Чтобы получить «исходную и предполагаемую оболочку», нажмите Ctrl - Пробел , Вернуть после ввода имени типа (т. Е. Использовать завершение кода).

2
ответ дан 2 December 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: