Entre int32
et int32_t
, (et de même 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 de nommé int8
ou int32
- ce dernier (s'il existe du tout) provient probablement d'un autre en-tête ou d'une bibliothèque (très probablement est antérieure à l'ajout de int8_t
et int32_t
dans C99).
Plain int
est assez différent des autres. Où int8_t
et int32_t
chacun ont une taille spécifiée, int
peut être n'importe quelle taille> = 16 bits. À des moments différents, 16 bits et 32 bits ont été raisonnablement courants (et pour une implémentation 64 bits, il devrait probablement s'agir de 64 bits).
D'autre part, il int
est garanti d'être présent dans chaque implémentation de C, où int8_t
et int32_t
non. Il est probablement possible de se demander si cela compte pour vous. Si vous utilisez 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 ordinateurs de bureau / serveur, ce ne sera probablement pas le cas.
Oups - j'ai manqué la partie à propos de char
. Vous utiliseriez à la int8_t
place de char si (et seulement si) vous voulez qu'un type entier soit garanti exactement 8 bits. Si vous souhaitez stocker des caractères, vous souhaiterez probablement utiliser à la char
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'y a aucune garantie quant à savoir si un plain char
est signé ou non (et de nombreux compilateurs peuvent en faire l'un ou l'autre, en fonction d'un indicateur de compilation). Si vous devez vous assurer qu'il est signé ou non signé, vous devez le spécifier explicitement.
bool_t
- je n'en ai jamais entendu parler auparavant. La norme C définit_Bool
comme un type intégré.bool
est défini uniquement si vous#include <stdbool.h>
(comme une macro qui se développe_Bool
).Les types de données _t sont des types typedef dans l'en-tête stdint.h, tandis que int est un type de données fondamental intégré. Cela rend le _t disponible uniquement si stdint.h existe. int, d'autre part, est garanti d'exister.
la source
Gardez toujours à l'esprit que 'size' est variable si elle n'est pas explicitement spécifiée, donc si vous déclarez
Sur certains systèmes, cela peut entraîner un entier de 16 bits par le compilateur et sur d'autres, il peut en résulter un entier de 32 bits (ou un entier de 64 bits sur les systèmes plus récents).
Dans les environnements embarqués, cela peut aboutir à des résultats étranges (en particulier lors de la gestion des E / S mappées en mémoire ou peut être considéré comme une situation de tableau simple), il est donc fortement recommandé de spécifier des variables de taille fixe. Dans les anciens systèmes, vous pouvez rencontrer
À partir de C99, les concepteurs ont ajouté le fichier d'en-tête stdint.h qui exploite essentiellement des typedefs similaires.
Sur un système basé sur Windows, vous pouvez voir des entrées dans le fichier d'en-tête stdin.h comme
Il y a beaucoup plus à 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.
la source
typedef short INT16;
nontypedefs short INT16
.