Quel est le meilleur moyen de déclarer un type entier toujours à 4 octets sur n’importe quelle plate-forme? Je ne m'inquiète pas pour certains appareils ou vieilles machines qui ont une int
16 bits.
#include <stdint.h>
int32_t my_32bit_int;
C ne se préoccupe pas beaucoup de la taille exacte des types entiers, C99 introduit l’en-tête stdint.h , qui est probablement votre meilleur choix. Incluez cela et vous pouvez utiliser par exemple int32_t
. Bien sûr, toutes les plates-formes ne peuvent pas supporter cela.
La réponse de Corey est correcte pour "meilleur", à mon avis, mais un simple "int" fonctionnera également dans la pratique (étant donné que vous ignorez les systèmes avec int de 16 bits). À ce stade, il faut que le code 32 bits soit si important que les fournisseurs de systèmes ne le modifient pas.
(Voir aussi pourquoi long est 32 bits sur beaucoup de systèmes 64 bits et pourquoi nous avons "long long".)
L'un des avantages d'utiliser int32_t, cependant, est que vous ne perpétuez pas ce problème!
Vous pouvez rechercher une copie du brg_types.h
de Brian Gladman si vous n'avez pas le stdint.h
.
brg_types.h
va découvrir les tailles des différents entiers sur votre plate-forme et va créer des typedefs pour les tailles courantes: 8, 16, 32 et 64 bits.
Vous devez inclure inttypes.h
au lieu de stdint.h
car stdint.h
n'est pas disponible sur certaines plates-formes telles que Solaris, et inttypes.h
inclut stdint.h
pour vous sur des systèmes tels que Linux. Si vous incluez inttypes.h
, votre code est plus portable entre Linux et Solaris.
Ce lien explique ce que je dis: lien HP sur inttypes.h
Et ce lien contient un tableau indiquant pourquoi vous ne souhaitez pas utiliser long
ou int
si vous avez l'intention qu'un certain nombre de bits soient présents dans votre type de données . lien IBM concernant les types de données portables
Si stdint.h n'est pas disponible pour votre système, créez le vôtre. J'ai toujours un fichier appelé "types.h" qui a typedefs pour toutes les valeurs signées/non signées 8, 16 et 32 bits.
en fonction également de vos plates-formes cibles, vous pouvez utiliser autotools pour votre système de construction
il verra si stdint.h/inttypes.h existe et si ce n'est pas le cas, créera les typedefs appropriés dans un "config.h"
stdint.h est le choix évident, mais il n’est pas nécessairement disponible.
Si vous utilisez une bibliothèque portable, il est possible qu'elle fournisse déjà des entiers portables à largeur fixe . Par exemple, SDL a Sint32
(S signifie «signé») et GLib a gint32
.
Utilisez <stdint.h>
.
Si votre implémentation prend en charge les entiers 32 bits du complément à 2, elle doit définir int32_t
.
Sinon, la meilleure solution est int_least32_t
, un type entier pris en charge par l'implémentation d'au moins 32 bits, quelle que soit la représentation (complément à deux, complément à un, etc.).
Il existe également int_fast32_t
, qui est un type entier d'au moins 32 bits de largeur, choisi dans le but de permettre les opérations les plus rapides pour cette taille requise.
Vous pouvez utiliser long
, dont la largeur minimale est garantie à 32 bits en raison des exigences de portée minimales spécifiées par la norme.
Si vous préférez utiliser le plus petit type entier pour un nombre 32 bits, vous pouvez utiliser les instructions de préprocesseur suivantes avec les macros définies dans <limits.h>
:
#define TARGET_MAX 2147483647L
#if SCHAR_MAX >= TARGET_MAX
typedef signed char int32;
#Elif SHORT_MAX >= TARGET_MAX
typedef short int32;
#Elif INT_MAX >= TARGET_MAX
typedef int int32;
#else
typedef long int32;
#endif
#undef TARGET_MAX