web-dev-qa-db-fra.com

Différence entre uint et unsigned int?

Y a-t-il une différence entre uint et unsigned int? Je regarde dans le site, mais toutes les questions se réfèrent à C # ou C++. Je voudrais une réponse sur C.

Notez que j'utilise GCC sous Linux.

50
the_candyman

uint n'est pas un type standard - unsigned int est.

68
Erik

Certains systèmes peuvent définir uint comme un typedef.

typedef unsigned int uint;

Pour ces systèmes, ils sont identiques. Mais uint n'est pas un type standard, donc chaque système peut ne pas le prendre en charge et donc il n'est pas portable.

33
taskinoor

J'étends un peu les réponses d'Erik, Teoman Soygul et taskinoor

uint n'est pas une norme.

Par conséquent, il est déconseillé d'utiliser votre propre raccourci comme celui-ci:

typedef unsigned int uint;

Si vous recherchez plutôt la spécificité de la plateforme (par exemple, vous devez spécifier le nombre de bits que votre int occupe), y compris stdint.h :

#include <stdint.h>

exposera les catégories standard suivantes d'entiers:

  • Types entiers ayant certaines largeurs exactes

  • Types entiers ayant au moins certaines largeurs spécifiées

  • Types d'entiers les plus rapides ayant au moins certaines largeurs spécifiées

  • Types entiers suffisamment larges pour contenir des pointeurs sur des objets

  • Types entiers ayant la plus grande largeur

Par exemple,

Types entiers de largeur exacte

Le nom typedef int N _t désigne un type entier signé avec une largeur N, pas de bits de remplissage et une représentation à deux compléments. Ainsi, int8_t désigne un type entier signé avec une largeur d'exactement 8 bits.

Le nom de typedef uint N _t désigne un type d'entier non signé de largeur N. Ainsi, uint24_t désigne un type d'entier non signé d'une largeur d'exactement 24 bits.

définit

int8_t
int16_t
int32_t
uint8_t
uint16_t
uint32_t
17
Yauhen Yakimovich

Toutes les réponses ici ne mentionnent pas la vraie raison de uint.
C'est évidemment un typedef de unsigned int, mais cela n'explique pas son utilité.

La vraie question est,

Pourquoi voudrait-on taper un type fondamental dans une version abrégée?

Pour économiser sur la frappe?
Non, ils l'ont fait par nécessité.

Considérez le langage C; une langue qui n'a pas de modèles.
Comment feriez-vous pour éradiquer votre propre vecteur qui peut contenir n'importe quel type?

Vous pourriez faire quelque chose avec des pointeurs vides,
mais une émulation plus proche des modèles vous obligerait à recourir à des macros.

Vous définiriez donc votre vecteur de modèle:

#define define_vector(type) \
  typedef struct vector_##type { \
    impl \
  };

Déclarez vos types:

define_vector(int)
define_vector(float)
define_vector(unsigned int)

Et lors de la génération, réalisez que les types doivent être un seul jeton:

typedef struct vector_int { impl };
typedef struct vector_float { impl };
typedef struct vector_unsigned int { impl };
8
Trevor Hickey

Le unsigned int est un type intégré (standard) donc si vous voulez que votre projet soit multi-plateforme, utilisez toujours unsigned int car il est garanti d'être pris en charge par tous les compilateurs (donc la norme).

7
Teoman Soygul