Question

est de type enum signé ou non? Le signedness de énumérations diffèrent en C / C99 / ANSI C / C ++ / C ++ x / GNU C / GNU C99?

Merci

Était-ce utile?

La solution

Un enum est assuré d'être représenté par un nombre entier, mais le type réel (et son signedness) est dépendant de l'implémentation.

Vous pouvez forcer une énumération à être représenté par un type signé en donnant l'un des agents recenseurs une valeur négative:

enum SignedEnum { a = -1 };

En C ++ 0x, le type sous-jacent d'une énumération peut être explicitement spécifié:

enum ShortEnum : short { a };

(C ++ 0x ajoute également le support pour les dénombrements scope)

Pour être complet, je vais ajouter que dans Le langage de programmation C, 2e éd. , les agents recenseurs sont spécifiés comme ayant int de type (p. 215). K & R ne sont pas la norme C, de sorte que ce n'est pas normatif pour les compilateurs ISO C, mais il n'antidater la norme ISO C, il est donc au moins intéressant d'un point de vue historique.

Autres conseils

Ceci est une vieille question ... mais je viens de trouver ce:

typedef unsigned ENUMNAME;  // this makes it unsigned in MSVC C 2015
typedef enum {v0, v1, v2, v3} ENUMNAME;

Vous pouvez l'utiliser comme un index non signé 2 bits, par exemple:

typedef struct {
  ENUMNAME i:2;
} STRUCTNAME;

Essayé dans GCC ARM - ne fonctionne pas
. En outre, WinDbg montre STRUCTNAME.i comme nombre , non pas comme v0-v3.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top