Question size_t est-il toujours non signé?


Comme titre: taille_t est-il toujours non signé, c’est-à-dire pour size_t x, est x toujours >= 0 ?


55
2017-07-06 20:55


origine


Réponses:


Oui. Ses d'habitude défini comme quelque chose comme ce qui suit (sur les systèmes 32 bits):

typedef unsigned int size_t;

Référence:

La norme C ++ Section 18.1 définit size_t est dans <cstddef> qui est décrit dans C Standard comme <stddef.h>.
C Norme 4.1.5 définit size_t comme un type intégral non signé du résultat du sizeof opérateur


46
2017-07-06 20:56



Selon la norme ISO C 1999 (C99), size_t est un type 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 entier supérieur à long si possible, c.-à-d. size_t à unsigned long n'est pas problématique si la recommandation est suivie.

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

La norme ISO C ++ de 1998 (C ++ 98) (ainsi que la version actuelle de C ++ 0x) fait référence à la norme C. L'article 18.1 se lit comme suit:

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

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

La bibliothèque décrite à l'article 7 de   ISO / IEC 9899: 1990 et article 7 de   ISO / IEC 9899 / Amd.1: 1995 est ci-après   appelé le Bibliothèque standard C.

Les pièces concernant size_t devrait être hérité de ANSI C: numérotation de la partie avant et de la section à part, les normes pour C90 et ANSI C sont identiques. J'aurais besoin d'une copie de l'amendement normatif pour m'assurer qu'il n'y avait pas de modifications pertinentes à stddef.hmais j'en doute. La taille minimale semble être introduite avec stdint.h, c'est-à-dire C99.

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

Toutes les normes sont sujettes à révision,   et les parties aux accords basés sur   la présente Norme internationale   encouragé à enquêter sur le   possibilité d'appliquer le plus   éditions récentes des normes   indiqué ci-dessous.


49
2017-07-06 21:01



Oui, taille_t est garanti pour être un type non signé.


14
2017-07-06 20:56



Selon le standard, il n'est pas signé, mais je rappelle que certaines anciennes implémentations utilisaient un type signé pour le typedef.

A partir d'un ancien document GCC:

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

Je ne sais pas combien il serait important de se prémunir contre cela. Mon code suppose qu'il n'est pas signé.


5
2017-07-06 21:06



La taille_t devrait suivre la même définition que la norme C, et à plusieurs endroits dans la norme C ++, cela implique qu'elle est non signée natura (en particulier dans les définitions d'argument du modèle allocator).

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

Le tableau 15 répertorie les types définis: ptrdiff_t et size_t

3 Le contenu est identique à 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 la présente 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 statique ou un membre de fonction non défini. VOIR AUSSI: Paragraphe 5.3.3, Tailleof, paragraphe 5.7, Opérateurs additifs, paragraphe 12.5, Stockage gratuit et ISO C paragraphe 7.1.6.


2
2017-07-06 21:26



Oh, c'est juste terrible:

vector<MyObject> arr;
Fill(arr);
size_t size = arr.size();
for(size_t i = 1; i < size - 1; ++i)
{
  auto obj = arr[i];
  auto next = arr[i+1];
}

Considérons maintenant le cas d'utilisation où arr est vide.


1
2017-12-02 10:49