133 votes

Différence entre int32, int, int32_t, int8 et int8_t

Je suis tombé sur le type de données int32_t dans un programme C récemment. Je sais qu'il stocke 32 bits, mais je n'ai pas int y int32 faire la même chose ?

Aussi, 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 ?

151voto

Jerry Coffin Points 237758

Entre int32 y int32_t (et de même entre int8 y int8_t ) la différence est assez simple : la norme C définit int8_t y int32_t mais ne définit rien de ce qui est nommé int8 o int32 -- ces derniers (s'ils existent) proviennent probablement d'un autre en-tête ou d'une autre bibliothèque (très probablement antérieurs à l'addition de int8_t y int32_t dans C99).

Plain int est assez différent des autres. Où se trouve int8_t y int32_t ont chacune une taille déterminée, int peut avoir une taille quelconque >= 16 bits. À différentes époques, les tailles de 16 et 32 bits ont été assez courantes (et pour une implémentation 64 bits, il faudrait probablement choisir 64 bits).

D'un autre côté, int est garanti d'être présent dans chaque implémentation de C, où int8_t y int32_t ne le sont pas. On peut probablement se demander si cela a de l'importance pour vous. Si vous utilisez le C sur de petits systèmes embarqués et/ou des compilateurs plus anciens, cela peut être un problème. Si vous l'utilisez principalement avec un compilateur moderne sur des machines de bureau/serveur, ce ne sera probablement pas le cas.

Oups -- j'ai manqué la partie sur char . Vous utiliseriez int8_t au lieu de char si (et seulement si) vous voulez un type d'entier dont la taille est garantie à exactement 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 il est garanti qu'il s'agit exactement d'un octet. Il y a cependant une petite bizarrerie : il n'y a pas de garantie qu'un simple fichier char est signé ou non signé (et de nombreux compilateurs peuvent faire l'un ou l'autre, en fonction d'un drapeau de compilation). Si vous devez vous assurer qu'il est signé ou non signé, vous devez le spécifier explicitement.

26voto

Superman Points 2269

Les types de données _t sont des types typés dans l'en-tête stdint.h, alors que int est un type de données fondamental intégré. Cela rend les _t disponibles seulement si stdint.h existe. int, par contre, est garanti d'exister.

9voto

Naumann Points 189

Gardez toujours à l'esprit que la "taille" est variable si elle n'est pas explicitement spécifiée, donc si vous déclarez

 int i = 10;

Sur certains systèmes, il peut résulter du compilateur un entier de 16 bits et sur d'autres un entier de 32 bits (ou 64 bits sur les systèmes plus récents).

Dans les environnements embarqués, cela peut donner des résultats bizarres (en particulier lors de la gestion des E/S en mémoire ou dans le cas d'un simple tableau), il est donc fortement recommandé de spécifier des variables de taille fixe. Dans les systèmes hérités, 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 exploite essentiellement des typologies similaires.

Sur un système Windows, vous pouvez voir dans le fichier d'en-tête stdin.h les entrées suivantes

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;

Il y a bien plus que cela, comme les types d'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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X