Hace aproximadamente un año compre un libro por amazon que estaba de oferta sobre C++, que me llamo bastante la atención. El libro se llama c++ primer plus, la quinta edición. Hoy tengo entendido que al menos van por la sexta.
El libro da una explicación acerca de los tipos enumerados que es la siguiente:Originalmente, los únicos valores validos para los tipo enumerado son aquellos nombrados en la declaración:
enum bits {one = 1, two = 2, four = 8, eight = 8}
bits myFlag = bits(6) // Un error segun la explicación que acabo de dar.
Pero c++ ha expandido la lista de valores validos que puedes utilizar a traves del uso de una conversión de tipo (como la que hemos utilizado en la segunda sentencia). Cada enumeración tiene un
rango, y tu puedes asignar cualquier entero en el
rango.
El
rango se define de una manera particular:
- Para hallar el limite superior, coges el valor del tipo enumerado mas alto (en este caso 8 ). Entonces buscas la potencia de 2 mas baja posible por encima de ese número (en este caso 16) y le restas 1 (quedando el limite superior en 15)
- Segundo, para encontrar el limite inferior, buscas el valor mas bajo del tipo enumerado (en este caso 0)
- Si el valor mas bajo es 0 o superior (que lo es) el limite inferior es siempre 0.
- Si el valor mas bajo es un número negativo (digamos que tenemos un -6) usas el mismo procedimiento que utilizaste para hallar el limite superior, pero en lugar de restar 1, sumas 1.
Ejemplo: el número mas bajo es -6, la potencia mas grande de 2 por debajo de ese número es -8. Le sumamos 1, quedando en -7 y ahí tenemos el limite inferior.
Según todo este procedimiento bits tiene un rango válido de 0-15
¡Vale! Hasta ahí la explicación y yo creo que se entiende bastante bien. A ver el libro es viejo, no se cuanto pero lo suficiente. Porque yo para hacer pruebas he creado un programa y he hecho algo así.
enum bits {one = 1, two = 2, four = 8, eight = 8}
bits myFlag = bits(59);
bits myFlag2 = bits(-500);
Y el programa no me suelta ningún tipo de error como sería de esperar, después de la explicación que acababa de leer. Lo que si ha hecho es almacenarme los valores bits(59) y bits(-500).
Algo ha cambiado con los tipos enumerado, ¿el que?