Il tipo enum
è firmato o non firmato? La Signedness delle enumerazioni differisce in C/C99/ANSI C/C++/C++ x/GNU C/GNU C99?Signedness enum in C/C99/C++/C++ x/GNU C/GNU C99
Grazie
Il tipo enum
è firmato o non firmato? La Signedness delle enumerazioni differisce in C/C99/ANSI C/C++/C++ x/GNU C/GNU C99?Signedness enum in C/C99/C++/C++ x/GNU C/GNU C99
Grazie
un'enumerazione è garantito di essere rappresentato da un numero intero, ma il tipo effettivo (e la sua signedness) dipende dall'implementazione.
È possibile forzare un'enumerazione di essere rappresentati da un tipo firmata dando uno degli enumeratori un valore negativo:
enum SignedEnum { a = -1 };
In C++ 0x, il tipo sottostante di un censimento può essere specificato esplicitamente:
enum ShortEnum : short { a };
(C++ 0x aggiunge anche il supporto per le enumerazioni con ambito)
per completezza, aggiungerò che in The C Programming Lingua, 2a ed., gli enumeratori sono specificati come aventi tipo int
(p. 215). K & R non è lo standard C, quindi non è normativo per i compilatori ISO C, ma fa precedere lo standard ISO C, quindi è almeno interessante dal punto di vista storico.
Questa è una vecchia questione ... ma ho appena scoperto questo:
typedef unsigned ENUMNAME; // this makes it unsigned in MSVC C 2015
typedef enum {v0, v1, v2, v3} ENUMNAME;
Potete usarlo come un indice senza segno 2-bit, per esempio:
typedef struct {
ENUMNAME i:2;
} STRUCTNAME;
Provato in GCC ARM - non funziona.
Inoltre, WinDbg mostra STRUCTNAME.i come numero , non come v0-v3.
Quale firma viene effettivamente utilizzata da gcc? – osgx
@osgx: Direi che dipenderà dal numero di enumeratori e dall'intervallo dei loro valori. Davvero non lo so. –
Lo standard C specifica inoltre che ciascuna costante * di enumerazione * ha tipo 'int'. Howeve, il termine "costante di enumerazione" si riferisce alle costanti di valore dichiarate all'interno del blocco 'enum {}'. Una variabile con un tipo 'enum' può avere qualsiasi tipo intero in C, ad es. potrebbe essere un tipo più breve di 'int' se uno può rappresentare tutti i valori. (GCC, per esempio, ha un'opzione '-fshort-enums' per fare esattamente questo.) – Arkku