2012-08-02 5 views
20

Je me demandais quelle est la différence entre uint32_t et uint32, et quand j'ai regardé dans les fichiers d'en-tête, il avait ceci:différence entre les différents types entiers

types.h: 

    /** @brief 32-bit unsigned integer. */ 
    typedef unsigned int uint32; 
stdint.h: 

    typedef unsigned uint32_t; 

Cela ne mène à d'autres questions: Quelle est la différence entre

unsigned varName; 

et

unsigned int varName; 

?

J'utilise MinGW.

+8

Ce sont les mêmes. Cependant, le type 'uint32' (et l'en-tête' ' ou le fichier '" types.h "') n'est pas défini par la norme C99. Si vous voulez utiliser un de ces types, utilisez 'uint32_t' et incluez l'en-tête' '. De même 'unsigned' et' unsigned int' sont identiques. – pmg

+1

Donc uint32 et ne font pas partie de la norme, mais uint32_t est? – user1507133

+2

@ user1507133: Oui. Fondamentalement, il n'y a rien de tel que 'uint32 'ni en C ni en C++. – AnT

Répondre

19

unsigned et unsigned int sont synonymes, tout comme [unsigned] short [int] et [unsigned] long [int].

uint32_t est un type défini (facultativement) par la norme C. uint32 est juste un nom que vous avez inventé, bien qu'il arrive à être défini comme la même chose.

+8

Un peu de nécromancie ici, mais en comparant 'unsigned [int]' '[unsigned] (short | long) [int]' peut donner aux nouveaux programmeurs la fausse impression que 'short' et' long' sont non signés par défaut. Je suggérerais 'unsigned (short | long) [int]' à la place. – bcrist

2

Il n'y a absolument aucune différence entre unsigned et unsigned int.

Si ce type correspond bien à uint32_t, cela dépend de l'implémentation; un int pourrait être "plus court" que 32 bits.

5

Il n'y a pas de différence.

unsigned int = uint32 = uint32_t = unsigned dans votre cas et unsigned int = unsigned toujours

+2

'unsigned int' ==' unsigned', mais il n'est en aucun cas garanti que 'uint32_t' ==' unsigned int'. 'unbigned int' peut avoir n'importe quelle largeur de bit à partir de 16 bit et plus. – AnT

+0

Dans un environnement * avec ces typedefs particuliers *, 'uint32_t' est par définition' unsigned int'. –

+3

@AndreyT: c'est pourquoi j'ai écrit "dans votre cas" – RiaD

1

unsigned et unsigned int sont synonymes pour des raisons historiques; ils signifient tous les deux «nombre entier non signé de la taille la plus naturelle pour l'architecture/plate-forme du processeur», ce qui est souvent (mais jamais toujours) 32 bits sur les plates-formes modernes.

<stdint.h> est un en-tête standard dans C99 qui est supposé donner des définitions de type pour des entiers de tailles particulières, avec la convention de dénomination uint32_t.

Le <types.h> que vous regardez semble être non-standard et appartient probablement à un cadre que votre projet utilise. Son uint32 typedef est compatible avec uint32_t. Si vous devriez utiliser l'un ou l'autre dans votre code est une question pour votre gestionnaire.

+0

" est un en-tête standard en C99". Qu'en est-il de C++ 98 et C++ 11? – user1507133

+0

'' est, je pense, l'en-tête standard C++ équivalent. –

+1

@ user1507133 - C++ 11 a qui amène ces types dans l'espace de noms 'std' (par exemple' std :: uint32_t'). C++ 98 n'a pas cet en-tête car il est antérieur à C99. POSIX fournit 'inttypes.h' avec les mêmes types si cela est suffisant. – Nemo

Questions connexes