Pergunta

É enum tipo assinado ou não assinado? A assinatura dos enumes é diferente em C/C99/ANSI C/C ++/C ++ X/GNU C/GNU C99?

Obrigado

Foi útil?

Solução

É garantido que uma enumeração seja representada por um número inteiro, mas o tipo real (e sua assinatura) depende da implementação.

Você pode forçar uma enumeração a ser representada por um tipo assinado, dando a um dos enumeradores um valor negativo:

enum SignedEnum { a = -1 };

Em C ++ 0x, o tipo subjacente de uma enumeração pode ser explicitamente especificado:

enum ShortEnum : short { a };

(C ++ 0x também adiciona suporte para enumerações escopinhas)

Para completar, vou adicionar isso em The C Programming Language, 2ª ed., enumeradores são especificados como tendo tipo int (p. 215). A K&R não é o padrão C, então isso não é normativo para os compiladores ISO C, mas precede o padrão ISO C, por isso é pelo menos interessante do ponto de vista histórico.

Outras dicas

Esta é uma pergunta antiga ... mas acabei de descobrir isso:

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

Você pode usá-lo como um índice não assinado de 2 bits, por exemplo:

typedef struct {
  ENUMNAME i:2;
} STRUCTNAME;

Tentei no GCC Arm - não funciona.
Além disso, o windbg mostra structname.i como um número, não como V0-V3.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top