111 votes

Les types tels que uint32, int32, uint64, int64 sont-ils définis dans un en-tête de la stdlib ?

Je vois souvent des codes sources utilisant des types tels que uint32, uint64 et je me demande s'ils doivent être définis par le programmeur dans le code de l'application ou s'ils sont définis dans un en-tête de librairie standard.

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

168voto

mu is too short Points 205090

Le C99 stdint.h les définit :

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

Et si l'architecture les soutient :

  • int64_t
  • uint64_t

Il existe d'autres typologies d'entiers dans la rubrique stdint.h également.

Si vous n'avez pas d'environnement C99, vous devriez probablement fournir vos propres typedefs et utiliser les typedefs C99 de toute façon.

En uint32 y uint64 (c'est-à-dire sans le _t ) sont probablement spécifiques à une application.

16 votes

Cette réponse est erronée. Toutes les options ci-dessus ne sont disponibles que si un type de largeur exacte de cette taille (sans rembourrage) existe dans l'implémentation. Même si ce n'est pas le cas, les types int_leastNN_t y uint_leastNN_t pour NN 8, 16, 32 et 64 doit toujours exister . Le C99 n'autorise pas les implémentations sans un type d'entier d'au moins 64 bits, puisque long long doit être au moins aussi grand.

0 votes

@R : Serait-il exact de dire "POSIX stdint.h" plutôt que "C99 stdint.h" ?

1 votes

POSIX stdint.h les exige tous.

15voto

GWW Points 20316

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

0 votes

N'est-ce pas stdint.h spécifique à la mise en œuvre ? Voir aussi cette question y cette question

3 votes

En regardant le fichier, j'ai trouvé "ISO C99 : 7.18 Integer types <stdint.h>" dans les commentaires. Je suppose que vous obtenez stdint.h si vous respectez la norme C99.

0 votes

Je n'en trouve aucun dans stdint.h . On obtient 0 résultat : grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t .

2voto

BiGYaN Points 1818

Si vous utilisez C99, il suffit d'inclure stdint.h . BTW, les types 64bit existent si le processeur les supporte.

0 votes

Veuillez citer quelque chose à ce sujet.

6 votes

X86 ne prend pas en charge les mathématiques 64 bits mais possède des types 64 bits.

2 votes

Oui, c'est le cas. Il prend en charge la multiplication 32 bits x 32 bits -> 64 bits, la division 64 bits / 32 bits -> quotient 32 bits et reste 32 bits, ainsi que les instructions d'addition avec report et de soustraction avec emprunt. Il a été conçu pour pouvoir effectuer des opérations arithmétiques sur 64 bits, ne serait-ce que parce que le 8086 devait pouvoir effectuer des opérations arithmétiques sur 32 bits.

0voto

Steve Points 21

L'auteur de la question s'est en fait interrogé sur int16 (etc) plutôt que sur int16_t (moche) (etc).

Il n'existe pas d'en-têtes standard - ni dans le dossier /usr/include/ de Linux - qui les définissent sans le "_t".

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