web-dev-qa-db-fra.com

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

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?

85
linuxfreak

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.

104
Jerry Coffin

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.

13
Superman

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.

2
Naumann