Estoy creando un conjunto de valores de enumeración, pero necesito que cada valor de enumeración tenga 64 bits de ancho. Si recuerdo correctamente, una enumeración es generalmente del mismo tamaño que una int; pero pensé que leí en alguna parte que (al menos en GCC) el compilador puede hacer que la enumeración tenga el ancho que sea necesario para mantener sus valores. Entonces, ¿es posible tener una enumeración de 64 bits de ancho?
140
Respuestas:
Una
enum
única se garantiza que sea lo suficientemente grande como para contenerint
valores. El compilador es libre de elegir el tipo real utilizado en función de las constantes de enumeración definidas para que pueda elegir un tipo más pequeño si puede representar los valores que defina. Si necesita constantes de enumeración que no encajan en unaint
, deberá usar extensiones específicas del compilador para hacerlo.fuente
enum
debería ser mayor que unoint
o menor? Siguiendo la respuesta de @MichaelStum, su primera oración debería ser "Unenum
solo se garantiza que encaja en unint
valor".int
. La respuesta de Michael Stum , que hace referencia a C99, dice que una enumeración puede ser tan pequeña como achar
.enum
única se garantiza que sea lo suficientemente grande como para mantener el valor de la mayor enumerador en la enumeración.Tomado del estándar C actual (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
No es que los compiladores sean buenos para seguir el estándar, pero esencialmente: si su enumeración contiene algo más que un int, está en un "comportamiento sin apoyo que puede volver a morderlo en un año o dos".
fuente
int
.short
ylong
son tipos enteros también, y cualquiera que sea la implementación que elija, todos los valores deben ajustarse (" será capaz de representar los valores de todos los miembros de la enumeración").int
, la variable de enumeración real podría ser de otro tipo. Esta es una inconsistencia bien conocida en el estándar.enum my_enum { my_value }
,my_value
tendrá tipoint
, peroenum my_enum
puede tener un tipo definido de implementación que al menos debe representar todos los valores de enumeración. Pormy_value
lo tanto, puede tener una conversión de reducción aenum my_enum
, pero se garantiza que no se desborde.Si bien las respuestas anteriores son correctas, algunos compiladores tienen opciones para romper el estándar y utilizar el tipo más pequeño que contendrá todos los valores.
Ejemplo con GCC (documentación en el Manual de GCC ):
fuente
Simplemente establezca el último valor de la enumeración en un valor lo suficientemente grande como para que sea del tamaño que desea que sea la enumeración, entonces debería ser ese tamaño:
fuente
No tenemos control sobre el tamaño de una
enum
variable. Depende totalmente de la implementación, y el compilador da la opción de almacenar un nombre para un número enteroenum
, porenum
lo que sigue el tamaño de un número entero.fuente
En lenguaje C,
enum
se garantiza que an tendrá el tamaño de anint
. Hay una opción de tiempo de compilación (-fshort-enums
) para que sea breve (esto es principalmente útil en caso de que los valores no sean más de 64K). No hay una opción de tiempo de compilación para aumentar su tamaño a 64 bits.fuente
Considera este código:
Dará 4 como salida. Entonces, no importa la cantidad de elementos que
enum
contenga, su tamaño siempre es fijo.fuente