В мире 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.
Если вы разрабатываете свое программное обеспечение на основе имен целочисленных типов, не зависящих от платформы, возможно, используя <inttypes.h>
заголовок C99 , который, когда типы доступны на платформе, обеспечивает подпись (в списке) и без знака (не в списке; префикс с «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-битных машинах. Привыкнуть к этому; мир не изменится.