У світі 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, виходячи з рекомендацій групи Аспен; лише системи з довгим спадком 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-бітних машинах існують різні системи для розмірів цілих типів даних. Звикнути; світ не збирається змінюватися.