Les types comme uint32, int32, uint64, int64 sont-ils définis dans n'importe quel en-tête stdlib?

94

Je vois souvent du code source utiliser des types comme uint32, uint64 et je me demande s'ils devraient être définis par le programmeur dans le code de l'application ou s'ils sont définis dans un en-tête de lib standard.

Quelle est la meilleure façon d'avoir ces types sur le code source de mon application?

Philix
la source

Réponses:

135

Le C99 stdint.hdéfinit ces éléments:

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

Et, si l'architecture les prend en charge:

  • int64_t
  • uint64_t

Il existe également divers autres typedefs entiers stdint.h.

Si vous êtes bloqué sans environnement C99, vous devriez probablement fournir vos propres typedefs et utiliser ceux C99 de toute façon.

Le uint32et uint64(c'est-à-dire sans le _tsuffixe) sont probablement spécifiques à l'application.

mu est trop court
la source
16
Cette réponse est fausse. Tout ce qui précède n'est disponible que si un type de largeur exact de cette taille (sans remplissage) existe dans l'implémentation. Même si ce n'est pas le cas, les types int_leastNN_tet uint_leastNN_tpour NN8, 16, 32 et 64 doivent toujours exister . C99 n'autorise pas les implémentations sans un type entier d'au moins 64 bits, car il long longdoit être au moins aussi grand.
R .. GitHub STOP HELPING ICE
@R ..: Serait-il exact de dire "POSIX stdint.h" plutôt que "C99 stdint.h"?
mu est trop court
1
POSIX les stdint.hrequiert tous.
R .. GitHub STOP AIDER ICE
1
@R .., pouvez-vous s'il vous plaît modifier cette réponse pour l'exactitude? Il m'a fallu un peu de temps pour analyser la combinaison du contenu actuel et de vos commentaires.
merlin2011
SDL définit l'alias de ce type d'alias typedef uint32_t Uint32;dans include / SDL_stdinc.h (si vous êtes un utilisateur SDL)
Et7f3XIV
10

Ces types entiers sont tous définis dans stdint.h

GWW
la source
N'est-ce pas stdint.hspécifique à la mise en œuvre? Voir aussi cette question et cette question
Chris Frederick
3
En regardant le fichier, j'ai trouvé "ISO C99: 7.18 Types entiers <stdint.h>" dans les commentaires. Je suppose que vous obtenez stdint.hsi vous respectez la norme C99.
philix
Je n'en trouve aucun stdint.h. Cela renvoie 0 succès: grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
jww
1
@jww: Dans mon cas, ce fichier contient #include "stdint-gcc.h", et la greffe de ce fichier donne les définitions.
Victor Zamanian
1
@jww ouais, ils n'existent pas. Les seuls qui sont standard et qui devraient être définis ici sont ceux avec le _tsuffixe, comme indiqué dans la réponse ci-dessus.
Victor Zamanian
2

Si vous utilisez C99, incluez simplement stdint.h. BTW, les types 64 bits sont là si le processeur les prend en charge.

BiGYaN
la source
Veuillez citer quelque chose à cet égard.
BiGYaN
6
x86 ne prend pas en charge les mathématiques 64 bits mais a des types 64 bits.
R .. GitHub STOP AIDER ICE
2
Oui. Il prend en charge la multiplication 32 bits x 32 bits -> 64 bits, le quotient 64 bits / 32 bits -> 32 bits et la division du reste 32 bits, ainsi que l'ajout avec report et soustraction avec des instructions d'emprunt. Il a été conçu pour pouvoir effectuer de l'arithmétique 64 bits, ne serait-ce que parce que le 8086 devait être capable de faire de l'arithmétique 32 bits.
Michael Morris
Il existe également un uint128_tif __SIZEOF_INT128__défini à 16 ou plus (GCC et compatibles). Il est disponible sur les machines x86_64 / amd64, mais le processeur ne le prend pas en charge nativement. Seuls les Cray ont cette taille de registre, IIRC.
jww
0

Le questionneur a en fait posé des questions sur int16 (etc) plutôt que sur (moche) int16_t (etc).

Il n'y a pas d'en-tête standard - ni aucun dans le dossier / usr / include / de Linux qui les définit sans le "_t".

Steve
la source