web-dev-qa-db-fra.com

Différence entre size_t et unsigned int?

Je suis tellement confus à propos de size_t. J'ai cherché sur Internet et partout mentionné que size_t est un type non signé et ne peut donc représenter que des valeurs non négatives.

Ma première question est la suivante: s’il est utilisé pour représenter uniquement des valeurs non négatives, pourquoi ne pas utiliser unsigned int au lieu de size_t?

Ma deuxième question est: are size_t et unsigned int interchangeable ou non? Si non, alors pourquoi?

Et quelqu'un peut-il me donner un bon exemple de size_t et brièvement son fonctionnement?

78
Vikas Verma

si c'est utilisé pour représenter une valeur non négative alors pourquoi ne pas utiliser unsigned int au lieu de size_t

Parce que unsigned int N'est pas le seul type entier non signé. size_t Peut être n'importe lequel des éléments suivants: unsigned char, unsigned short, unsigned int, unsigned long Ou unsigned long long, Selon l'implémentation.

La deuxième question est que size_t Et unsigned int Sont interchangeables ou non et si non, pourquoi?

Ils ne sont pas interchangeables, pour la raison expliquée ci-dessus ^^.

Et est-ce que quelqu'un peut me donner un bon exemple de taille et de son bref travail?

Je ne comprends pas très bien ce que vous entendez par "son bref travail". Cela fonctionne comme n'importe quel autre type non signé (en particulier, comme le type dans lequel il est typé). Nous vous encourageons à utiliser size_t Lorsque vous décrivez la taille d'un objet. En particulier, l'opérateur sizeof et diverses fonctions de bibliothèque standard, telles que strlen(), renvoient size_t.

Bonus: voici un bon article environ size_t (Et le type ptrdiff_t Étroitement lié). C'est une très bonne raison pour laquelle vous devriez l'utiliser.

72
user529758

Il existe 5 types d'entiers standard non signés en C:

  • unsigned char
  • unsigned short
  • unsigned int
  • unsigned long
  • unsigned long long

avec différentes exigences pour leurs tailles et leurs gammes (brièvement, la gamme de chaque type est un sous-ensemble de la gamme du type suivant, mais certains d'entre eux peuvent avoir la même gamme).

size_t est un typedef (c'est-à-dire un alias) pour un type non signé (probablement l'un des types précédents mais peut-être un type entier étendu non signé, bien que cela soit peu probable). C'est le type fourni par l'opérateur sizeof.

Sur un système, il pourrait être judicieux d’utiliser unsigned int pour représenter les tailles; sur un autre, il serait peut-être plus logique d'utiliser unsigned long ou unsigned long long. (size_t _ est peu probable que ce soit unsigned char ou unsigned short, mais c'est autorisé).

Le but de size_t est de soulager le programmeur de son souci de lequel des types prédéfinis est utilisé pour représenter les tailles.

Le code qui suppose que sizeof donne un unsigned int ne serait pas portable. Code qui suppose qu'il donne un size_t est plus susceptible d'être portable.

59
Keith Thompson

size_t a une restriction spécifique.

Citant de http://www.cplusplus.com/reference/cstring/size_t/ :

Alias ​​de l'un des types entiers fondamentaux non signés.

C'est un type capable de représenter la taille de tout objet en octets : size_t est le type renvoyé par l'opérateur sizeof et est largement utilisé dans la bibliothèque standard pour représenter les tailles et les comptes.

Il n'est pas interchangeable avec unsigned int parce que la taille de int est spécifiée par le modèle de données. Par exemple, LLP64 utilise un int 32 bits et ILP64 utilise un int 64 bits.

9
DrYap

size_t est utilisé pour stocker la taille des objets de données et il est garanti qu'il est capable de contenir la taille de tout objet de données que l'implémentation C particulière peut créer. Ce type de données peut être plus petit (en nombre de bits), plus grand ou identique à unsigned int.

En plus des autres réponses, il documente également le code et dit aux gens que vous parlez de la taille des objets en mémoire.

2
Ed Heal

type_taille est un type entier de base non signé du langage C/C++. C'est le type du résultat renvoyé par l'opérateur sizeof. La taille du type est choisie de manière à pouvoir stocker la taille maximale d'un tableau théoriquement possible de tout type. Sur un système 32 bits, size_t prendra 32 bits, sur un 64 bits, un 64 bits. En d'autres termes, une variable de type size_t peut stocker en toute sécurité un pointeur. L'exception concerne les pointeurs vers les fonctions de classe, mais il s'agit d'un cas particulier. Bien que size_t puisse stocker un pointeur, il est préférable d'utiliser un autre type d'entier non signé uintptr_t à cette fin (son nom reflète sa capacité). Les types size_t et uintptr_t sont des synonymes. Le type size_t est généralement utilisé pour les compteurs de boucles, l'indexation de tableaux et l'arithmétique d'adresses. La valeur maximale possible du type size_t est la constante SIZE_MAX.

2
user2873459

En termes simples, size_t dépend de la plate-forme et de l'implémentation, alors que unsigned int dépend uniquement de la plate-forme.

0
Kaushal Billore