В мире Unix было несколько возможных вариантов размеров целых чисел и указателей для 64-битных платформ. Двумя наиболее широко используемыми были ILP64 (на самом деле, только несколько примеров этого; Cray был одним из таких) и LP64 (почти для всего остального). Сокращения происходят от «int, long, указатели 64-битные» и «long, указатели 64-битные».
Type ILP64 LP64 LLP64
char 8 8 8
short 16 16 16
int 64 32 32
long 64 64 32
long long 64 64 64
pointer 64 64 64
Система ILP64 была заброшена в пользу LP64 (то есть почти все более поздние участники использовали LP64, основываясь на рекомендациях группы Aspen; только системы с долгим наследием использования 64-битных операций другая схема). Все современные 64-битные системы Unix используют LP64. MacOS X и Linux являются современными 64-битными системами.
Microsoft использует другую схему для перехода на 64-разрядную версию: LLP64 («long long, указатели 64-разрядные»). Это означает, что 32-разрядное программное обеспечение можно перекомпилировать без изменений. Он отличается от того, что делают все остальные, и также требует пересмотра кода для использования 64-битных возможностей. Там всегда был пересмотр необходим; это был просто набор ревизий, отличающийся от тех, которые были необходимы на платформах Unix.
Если вы разрабатываете свое программное обеспечение на основе имен целочисленных типов, не зависящих от платформы, возможно, используя заголовок C99 <inttypes.h>
, который, когда типы доступны на платформе, обеспечивает префикс со знаком (в списке) и без знака (не в списке; с 'u'):
int8_t
- 8-битные целые числа
int16_t
- 16-разрядные целые числа
int32_t
- 32-разрядные целые числа
int64_t
- 64-разрядные целые числа
uintptr_t
- целые числа без знака, достаточно большие, чтобы содержать указатели
intmax_t
- самый большой размер целого на платформе (может быть больше int64_t
)
Затем вы можете кодировать свое приложение, используя эти типы, где это важно, и быть очень осторожными с типами системы (которые могут отличаться). Существует тип intptr_t
- целочисленный тип со знаком для хранения указателей; вы должны планировать не использовать его или использовать только в результате вычитания двух uintptr_t
значений (ptrdiff_t
).
Но, как указывает вопрос (с недоверием), существуют разные системы для размеров целочисленных типов данных на 64-битных машинах. Привыкнуть к этому; мир не изменится.