Différence entre size_t et unsigned int?

107

Je suis tellement confus size_t . J'ai recherché sur Internet et partout mentionné qu'il size_ts'agit d'un type non signé, il ne peut donc représenter que des valeurs non négatives.

Ma première question est: s'il est utilisé pour ne représenter que des valeurs non négatives, pourquoi n'utilisons-nous pas unsigned int place de size_t?

Ma deuxième question est: sont size_t et unsigned intinterchangeables ou non? Sinon, pourquoi?

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

Vikas Verma
la source
5
typedef /*This part is implementation dependent */ size_t;
P0W
5
duplication possible de unsigned int vs size_t

Réponses:

87

s'il est utilisé pour représenter une valeur non négative, alors pourquoi nous n'utilisons pas à la unsigned intplace desize_t

Car unsigned intn'est pas le seul type entier non signé. size_tpourrait être l' un unsigned char, unsigned short, unsigned int, unsigned longou unsigned long long, en fonction de la mise en œuvre.

La deuxième question est celle-ci size_tet unsigned intsont interchangeables ou non et si non, pourquoi?

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

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

Je ne comprends pas tout à fait ce que vous entendez par «son bref fonctionnement». Il fonctionne comme tout autre type non signé (en particulier, comme le type sur lequel il est tapé). Vous êtes encouragé à utiliser size_tlorsque vous décrivez la taille d'un objet. En particulier, l' sizeofopérateur et diverses fonctions de bibliothèque standard, telles que strlen(), return size_t.

Bonus: voici un bon article sur size_t(et le ptrdiff_ttype étroitement lié ). Cela explique très bien pourquoi vous devriez l'utiliser.

Santhosh Kumar
la source
1
Comment exactement peut size_têtre un unsigned char? Est-ce dans la norme que c'est autorisé? Je veux dire avec cette idée comment pourrait-on s'attendre à ce que quelqu'un utilise calloc()(et sa famille), strlen()etc.? Cela me paraît absurde.
Pryftan
Je pense qu'il size_test défini dans la norme comme étant un "type entier non signé", mais n'exige pas qu'il soit le même que l'un des unsigned {char, short, int, long, long long}.
Paul Hankin le
80

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

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

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

size_test un typedef(c'est-à-dire un alias) pour un type non signé, (probablement l'un des types ci-dessus mais peut-être un type entier non signé étendu , bien que ce soit peu probable). C'est le type cédé par lesizeof opérateur.

Sur un système, il peut être judicieux d'utiliser unsigned intpour représenter les tailles; sur un autre, il pourrait être plus judicieux d'utiliser unsigned longou unsigned long long. (il size_test peu probable que ce soit l'un unsigned charou l' autre unsigned short, mais c'est permis).

Le but de size_test de dispenser le programmeur d'avoir à se soucier de savoir lequel des types prédéfinis est utilisé pour représenter les tailles.

Le code qui suppose sizeofun rendement unsigned intne serait pas portable. Code qui suppose qu'il donne unsize_t est plus susceptible d'être portable.

Keith Thompson
la source
6
Je pense que cela devrait être la réponse acceptée car elle explique pourquoi vous devriez utiliser size_t
kuchi
@ keith-thompson alors cela signifie-t-il que le type spécifique (c'est-à unsigned int- dire unsigned long, etc.) qui size_tcorrespond à dépend de la machine sur laquelle le code est exécuté? c'est-à-dire sur une architecture de machine, cela correspond à unsigned intmais sur une autre architecture à laquelle il correspondra unsigned long, etc?
Richie Thomas
1
@RichieThomas: Cela dépend de l'implémentation C. Deux compilateurs différents sur la même architecture peuvent choisir des types différents pour size_t, en particulier si, par exemple, unsigned longet unsigned long longsont de la même taille.
Keith Thompson
@RichieThomas Cela en fait également partie. C'est-à-dire que le maximum de long, long longetc. dépend du système: si vous regardez, limits.hvous verrez au moins sous Unices que la valeur maximum pour les entiers dépend de la taille des mots du système.
Pryftan
1
@Pryftan Jetez un œil à la série Motorola 68000, ainsi qu'à l'ancienne série Intel x86 (remontant aux 8086 et 8088).
Keith Thompson
10

size_t a une restriction spécifique.

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

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

C'est un type capable de représenter la taille de n'importe quel 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 nombres.

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

DrYap
la source
5
D'où vient cette citation? (Ce n'est pas de la norme C.)
Keith Thompson
2
La question est étiquetée c . La norme C ++ n'a aucune incidence sur C.
IInspectable
7

size_t est utilisé pour stocker les tailles des objets de données, et il est garanti qu'il peut 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 exactement le même que unsigned int.

Thomas Padron-McCarthy
la source
4

Outre les autres réponses, il documente également le code et indique aux gens que vous parlez de la taille des objets en mémoire

Ed Heal
la source
Bon point. An appleest une pomme , a size_test une taille ...
dom_beau
2

Le type size_t est un type entier non signé de base 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 64 bits. En d'autres termes, une variable de type size_t peut stocker un pointeur en toute sécurité. L'exception concerne les pointeurs vers des 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 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.

user2873459
la source
1
size_tpeut stocker la taille de n'importe quel objet unique. Un pointeur peut pointer vers n'importe quel octet de n'importe quel objet. Vous pouvez avoir un système avec, par exemple, un espace d'adressage de 64 bits qui limite la taille d'un objet à 2 ** 32-1 octets. Il n'y a aucune garantie que size_tet uintptr_tsont du même type.
Keith Thompson
2

En termes simples, size_t dépend de la plate-forme et dépend de la mise en œuvre, tandis que unsigned int dépend uniquement de la plate-forme.

Kaushal Billore
la source