Je suis récemment tombé sur le type de données int32_t
dans un programme C. Je sais qu'il stocke 32 bits, mais int
et int32
ne font-ils pas de même?
De plus, je veux utiliser char
dans un programme. Puis-je utiliser int8_t
à la place? Quelle est la différence?
Pour résumer: quelle est la différence entre int32, int, int32_t, int8 et int8_t en C?
Entre int32
et int32_t
, (et également entre int8
et int8_t
), la différence est assez simple: le standard C définit int8_t
et int32_t
, mais ne définit rien qui s'appelle int8
ou int32
- ce dernier (s’il existe) est probablement issu d’un autre en-tête ou bibliothèque (probablement antérieur à l’ajout de int8_t
et int32_t
en C99).
Plain int
est assez différent des autres. Où int8_t
et int32_t
ont chacun une taille spécifiée, int
peut avoir toute taille> = 16 bits. À des moments différents, 16 bits et 32 bits ont été raisonnablement communs (et pour une implémentation de 64 bits, il devrait probablement être de 64 bits).
D'autre part, il est garanti que int
soit présent dans chaque implémentation de C, où int8_t
et int32_t
ne le sont pas. Vous pouvez probablement vous demander si cela vous concerne. Si vous utilisez C sur de petits systèmes intégrés et/ou des compilateurs plus anciens, cela peut poser problème. Si vous l'utilisez principalement avec un compilateur moderne sur des ordinateurs de bureau/serveur, ce ne sera probablement pas.
Oups - vous avez manqué la partie sur char
. Vous utiliseriez int8_t
au lieu de char si (et seulement si) vous voulez un type entier garanti avec une taille exacte de 8 bits. Si vous voulez stocker des caractères, vous voudrez probablement utiliser char
à la place. Sa taille peut varier (en termes de nombre de bits) mais elle est garantie d'être exactement un octet. Une petite bizarrerie cependant: il n’ya aucune garantie de savoir si un char
simple est signé ou non (et de nombreux compilateurs peuvent en faire un, en fonction du drapeau de compilation). Si vous devez vous assurer qu'il est signé ou non signé, vous devez le spécifier explicitement.
Les types de données _t sont des types typedef dans l'en-tête stdint.h, alors que int est un type de données fondamental intégré. Cela rend le _t disponible uniquement si stdint.h existe. En revanche, int est garanti.
Gardez toujours à l'esprit que 'taille' est variable si non spécifié explicitement, donc si vous déclarez
int i = 10;
Sur certains systèmes, cela peut entraîner un entier de 16 bits par le compilateur et sur d'autres, un entier de 32 bits (ou un entier de 64 bits sur les systèmes plus récents).
Dans les environnements intégrés, cela peut donner des résultats étranges (en particulier lors de la gestion des E/S mappées en mémoire ou être considéré comme une situation de tableau simple), il est donc fortement recommandé de spécifier des variables de taille fixe. Dans les systèmes existants, vous pouvez rencontrer
typedef short INT16;
typedef int INT32;
typedef long INT64;
À partir de C99, les concepteurs ont ajouté le fichier d'en-tête stdint.h, qui s'appuie essentiellement sur des définitions de type similaires.
Sur un système Windows, vous pouvez voir les entrées du fichier d’en-tête stdin.h comme suit:
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
Il y a bien d'autres choses à cela, comme des types entiers de largeur minimale ou de largeur exacte, je pense que ce n'est pas une mauvaise chose d'explorer stdint.h pour une meilleure compréhension.