W świecie uniksowym istniało kilka możliwych konfiguracji rozmiarów liczb całkowitych i wskaźników dla platform 64-bitowych. Dwa najczęściej używane to ILP64 (właściwie tylko kilka przykładów; Cray był jednym z nich) i LP64 (do prawie wszystkiego innego). Akronynmy pochodzą od „int, long, wskaźniki są 64-bitowe” i „long, wskaźniki są 64-bitowe”.
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
Zrezygnowano z systemu ILP64 na rzecz LP64 (czyli prawie wszyscy późniejsi uczestnicy korzystali z LP64, w oparciu o zalecenia grupy Aspen; tylko systemy z długą tradycją 64-bitowego działania używają innego schematu). Wszystkie nowoczesne 64-bitowe systemy Unix używają LP64. MacOS X i Linux to nowoczesne systemy 64-bitowe.
Firma Microsoft używa innego schematu przejścia na wersję 64-bitową: LLP64 („długie długie, wskaźniki są 64-bitowe”). Ma to tę zaletę, że oznacza, że oprogramowanie 32-bitowe można ponownie skompilować bez zmian. Ma wadę polegającą na tym, że różni się od tego, co robią wszyscy inni, a także wymaga korekty kodu, aby wykorzystać pojemność 64-bitową. Zawsze była konieczna korekta; był to po prostu inny zestaw poprawek niż te potrzebne na platformach Unix.
Jeśli projektujesz oprogramowanie w oparciu o nazwy typów całkowitych neutralnych dla platformy, prawdopodobnie przy użyciu <inttypes.h>
nagłówka C99 , który, gdy typy są dostępne na platformie, zawiera podpisane (wymienione) i niepodpisane (niewymienione; przedrostek z literą „u”):
int8_t
- 8-bitowe liczby całkowite
int16_t
- 16-bitowe liczby całkowite
int32_t
- 32-bitowe liczby całkowite
int64_t
- 64-bitowe liczby całkowite
uintptr_t
- liczby całkowite bez znaku wystarczająco duże, aby pomieścić wskaźniki
intmax_t
- największy rozmiar liczby całkowitej na platformie (może być większy niż int64_t
)
Następnie możesz zakodować swoją aplikację przy użyciu tych typów, jeśli ma to znaczenie, i bardzo ostrożnie z typami systemów (które mogą być różne). Istnieje intptr_t
typ - typ liczby całkowitej ze znakiem do przechowywania wskaźników; powinieneś planować nie używać go lub używać go tylko w wyniku odejmowania dwóch uintptr_t
wartości ( ptrdiff_t
).
Ale, jak wskazuje pytanie (z niedowierzaniem), istnieją różne systemy rozmiarów całkowitych typów danych na maszynach 64-bitowych. Przyzwyczaić się do tego; świat się nie zmieni.