112 votes

Les enums C++ signés ou non signés ?

Les enums C++ signés ou non signés ? Et par extension est-il sécuritaire valider une entrée en vérifiant qu’il est = votre valeur min (en supposant que vous avez commencé à 0 et incrémenté de 1) ?

105voto

Michael Burr Points 181287

Nous allons aller à la source. Voici ce que le C++03 norme (ISO/IEC 14882:2003) document dit dans 7.2-5 (Énumération des déclarations):

Le type sous-jacent d'une énumération est un type intégral qui peut représenter tous les énumérateur valeurs définies dans l'énumération. Il est la mise en œuvre définies intégral type est utilisé comme le type sous-jacent pour une énumération, sauf que le le type sous-jacent ne doit pas être plus grand que d'int moins que la valeur d'un énumérateur ne peuvent pas rentrer dans un int ou unsigned int.

En bref, votre compilateur fait le choix (évidemment, si vous avez des nombres négatifs pour certains de vos ennumeration valeurs, ça va être signé).

64voto

zvrba Points 14028

Vous ne devrait pas compter sur une représentation spécifique. Lire le liensuivant. En outre, la norme dit qu’il est défini par l’implémentation quel type intégral est utilisé comme type sous-jacent d’un enum, sauf qu’il ne doit pas être supérieur à int, à moins qu’une valeur ne peut pas tenir en int ou unsigned int

En bref : vous ne pouvez pas compter sur un enum étant soit signé ou non signé.

25voto

Adam Rosenfield Points 176408

Vous ne devriez pas dépendent d’eux étant signé ou non signé. Si vous voulez faire leur explicitement signé ou non signé, vous pouvez utiliser le texte suivant :

16voto

Matt Points 8959

Vous ne devriez pas compter sur elle étant soit signé ou non signé. Selon la norme, c'est la mise en œuvre défini le type intégral est utilisé comme le type sous-jacent pour un enum. Dans la plupart des implémentations, cependant, il est un entier signé.

Dans C++0x fortement typé énumérations sera ajoutée qui va vous permettre de spécifier le type d'une enum tels que:

enum X : signed int { ... };    // signed enum
enum Y : unsigned int { ... };  // unsigned enum

Même maintenant, cependant, certains de validation simple peut être réalisé à l'aide de la enum comme une variable ou d'un type de paramètre comme ceci:

enum Fruit { Apple, Banana };

enum Fruit fruitVariable = Banana;  // Okay, Banana is a member of the Fruit enum
fruitVariable = 1;  // Error, 1 is not a member of enum Fruit
                    // even though it has the same value as banana.

5voto

Cristián Romo Points 2802

Le compilateur peut décider si oui ou non les enums sont signés ou non signés.

Une autre méthode de validation des enums consiste à utiliser l’enum elle-même comme un type de variable. Par exemple :

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