60 votes

size_t est-il toujours non signé ?

En titre : est-ce que size_t est toujours non signé, c'est-à-dire pour size_t x c'est x toujours >= 0 ?

51voto

Christoph Points 64389

Selon la norme ISO C de 1999 (C99), size_t est un type d'entier non signé d'au moins 16 bits (voir les sections 7.17 et 7.18.3).

La norme recommande également que size_t ne devrait pas avoir un rang de conversion d'entier supérieur à long si possible, c'est-à-dire le casting size_t à unsigned long ne pose aucun problème si la recommandation est suivie.

La norme C de 1989 (ANSI C) ne mentionne pas de taille minimale ni de rang de conversion recommandé.

La norme ISO C++ de 1998 (C++98) (ainsi que le projet actuel pour C++0x) fait référence à la norme C. La section 18.1 se lit comme suit

Le contenu est le même que celui de l'en-tête de la bibliothèque C standard. <stddef.h> [...]

Selon la section 1.2, il s'agit de la bibliothèque telle que définie par la norme ISO C de 1990 (C90), y compris son premier amendement de 1995 (C95) :

La bibliothèque décrite dans la clause 7 de ISO/IEC 9899:1990 et la clause 7 de la norme ISO/IEC 9899/Amd.1:1995 est appelée ci-après appelée la Bibliothèque C standard .

Les parties concernant size_t devrait être hérité de l'ANSI C : à l'exception de la numérotation des articles et des sections, les normes C90 et ANSI C sont identiques. J'aurais besoin d'une copie de l'amendement normatif pour m'assurer qu'il n'y a pas eu de changements pertinents à la norme C90. stddef.h mais j'en doute. La taille minimale semble avoir été introduite avec stdint.h , ie C99.

Veuillez également considérer la citation suivante de la section 1.2 de C++98 :

Toutes les normes sont susceptibles d'être révisées, et les parties aux accords basés sur la présente Norme internationale sont encouragées à étudier la la possibilité d'appliquer les éditions les plus éditions les plus récentes des normes indiquées ci-dessous.

50voto

Mehrdad Afshari Points 204872

Oui . C'est généralement défini comme suit (sur les systèmes 32 bits) :

typedef unsigned int size_t;

Référence :

La section 18.1 de la norme C++ définit size_t est en <cstddef> qui est décrit dans la norme C comme <stddef.h> .
La section 4.1.5 de la norme C définit size_t en tant que type d'intégrale non signée du résultat de la fonction sizeof opérateur

14voto

nos Points 102226

Oui, size_t est garanti comme étant un type non signé.

5voto

Michael Burr Points 181287

Selon la norme, il est non signé, mais je me souviens que certaines implémentations plus anciennes utilisaient un type signé pour le typedef.

D'une ancienne documentation GCC :

Il existe un problème potentiel avec le type size_t et les versions de GCC antérieures à la version 2.4. L'ANSI C exige que size_t est toujours un type non signé. Pour la compatibilité avec les fichiers d'en-tête des systèmes existants, GCC définit size_t sur stddef.h pour être le type que le système sys/types.h le définit comme tel. La plupart des systèmes Unix qui définissent size_t sur sys/types.h pour le définir comme un type signé. Certains codes de la bibliothèque dépendent de size_t étant un type non signé, il ne fonctionnera pas correctement s'il est signé.

Je ne suis pas sûr qu'il soit important de se prémunir contre cela. Mon code suppose que c'est non signé.

2voto

njsf Points 1896

La définition de size_t devrait être la même que celle de la norme C, et à plusieurs endroits dans la norme C++, elle implique sa nature non signée (en particulier dans les définitions des arguments du modèle d'allocateur).

Sur la norme C++, section 18.1 (ISO/IEC 14882 - Première édition 1998-01-01) :

Le tableau 15 énumère les types définis : ptrdiff_t et size_t.

3 Le contenu est le même que celui de l'en-tête de la bibliothèque C standard, avec les modifications suivantes : 4 La macro NULL est une constante de pointeur nul C++ définie par l'implémentation dans cette norme internationale (4.10).

La macro offsetof accepte un ensemble restreint d'arguments de type dans la présente Norme internationale. type doit être une structure POD ou une union POD (clause 9). Le résultat de l'application de la macro offsetof à un champ qui est un membre de données statiques ou un membre de fonction est indéfini. est un membre de données statiques ou un membre de fonction est indéfini. VOIR AUSSI : subclause 5.3.3, Sizeof, subclause 5.7, Additive operators, subclause 12.5, Free store, et ISO C, sous-clause 7.1.6.

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