Dans le monde Unix, il y avait quelques arrangements possibles pour les tailles d'entiers et de pointeurs pour les plates-formes 64 bits. Les deux les plus largement utilisés étaient ILP64 (en fait, seuls quelques exemples de cela; Cray en était un) et LP64 (pour presque tout le reste). Les acronynms proviennent de «int, long, les pointeurs sont 64 bits» et «longs, les pointeurs sont 64 bits».
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
Le système ILP64 a été abandonné au profit de LP64 (c'est-à-dire que presque tous les nouveaux venus ont utilisé LP64, sur la base des recommandations du groupe Aspen; seuls les systèmes avec un long héritage d'exploitation 64 bits utilisent un schéma différent). Tous les systèmes Unix 64 bits modernes utilisent LP64. MacOS X et Linux sont tous deux des systèmes 64 bits modernes.
Microsoft utilise un schéma différent pour la transition vers 64 bits: LLP64 («long long, les pointeurs sont 64 bits»). Cela a le mérite de signifier que les logiciels 32 bits peuvent être recompilés sans changement. Il a l'inconvénient d'être différent de ce que tout le monde fait et nécessite également une révision du code pour exploiter les capacités 64 bits. Il y avait toujours une révision nécessaire; c'était juste un ensemble de révisions différent de ceux nécessaires sur les plates-formes Unix.
Si vous concevez votre logiciel autour de noms de type entiers neutres de la plate-forme, probablement en utilisant l'en- <inttypes.h>
tête C99 , qui, lorsque les types sont disponibles sur la plate-forme, fournit, en signé (listé) et non signé (non listé; préfixe avec 'u'):
int8_t
- Entiers 8 bits
int16_t
- Entiers 16 bits
int32_t
- Entiers 32 bits
int64_t
- Entiers 64 bits
uintptr_t
- entiers non signés assez grands pour contenir des pointeurs
intmax_t
- plus grande taille d'entier sur la plate-forme (peut être plus grande que int64_t
)
Vous pouvez ensuite coder votre application en utilisant ces types là où cela compte, et en faisant très attention aux types de système (qui peuvent être différents). Il existe un intptr_t
type - un type entier signé pour contenir des pointeurs; vous devez prévoir de ne pas l'utiliser, ou de ne l'utiliser qu'à la suite d'une soustraction de deux uintptr_t
valeurs ( ptrdiff_t
).
Mais, comme le souligne la question (incrédule), il existe différents systèmes pour les tailles des types de données entiers sur les machines 64 bits. Habituez-vous à cela; le monde ne va pas changer.