Я выполнил дамп сборки и обнаружил разницу между двумя версиями:
@@ -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
Однобайтовый целочисленный тип со знаком - 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-битном компиляторе.
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 теперь имеют размер регистра ЦП.
Кардинальное число и Целое число являются псевдонимами.
Cardinal ==> LongWord (unsigned)
Integer ==> LongInt (signed)
Чтобы получить «исходную и предполагаемую оболочку», нажмите Ctrl - Пробел , Вернуть после ввода имени типа (т. Е. Использовать завершение кода).