It's up to the implementation how big an enum is. From section 6.7.2.2p4 of the C standard regarding Enumeration specifiers:
Each enumerated type shall be compatible with char , a signed integer type, or an unsigned integer type.
The choice of type is implementation-defined, but shall be capable of representing the values of all the members of the enumeration. The enumerated type is incomplete until immediately after the } that terminates the list of enumerator declarations, and complete thereafter.
So the size of an enum type could be the size of an int, char, or any other integer type. As an example, gcc sizes enums as follows:
Normally, the type is unsigned int if there are no negative values in the enumeration, otherwise int. If -fshort-enums is specified, then if there are negative values it is the first of signed char, short and int that can represent all the values, otherwise it is the first of unsigned char, unsigned short and unsigned int that can represent all the values.
As for the values of each member, paragraph 3 states:
The identifiers in an enumerator list are declared as constants that have type int and may appear wherever such
are permitted. An enumerator with = defines its enumeration constant as the value of the constant expression. If the first enumerator has no = , the value of its enumeration constant is 0. Each subsequent enumerator with no = defines its enumeration constant as the value of the constant expression obtained by adding 1 to the value of the previous enumeration constant. (The use of enumerators with = may produce enumeration constants with values that duplicate other values in the same enumeration.) The enumerators of an enumeration are also known as its members.
In this case, the constant ENUM_5 is explicitly assigned the value 0xFFFFFFF0, so ENUM_6 is 0xFFFFFFF, ENUM_7 is 0xFFFFFFF2, and ENUM_8 is 0xFFFFFFF3. Each of these constants needs 4 bytes to store the value, so this particular enum must be at least 4 bytes in size, although it could be larger.
Regarding:
How it saves all of its enum member values within 4 bytes?
It doesn't hold all 4 members at once. An enum can hold one of those 4 members. You're defining a type, not a value. For example:
enum enumStruc_2 e1 = ENUM_5; enum enumStruc_2 e2 = ENUM_6;
enum. To be able to represent all of four distinct values requires no more than two bits. Since the compiler needs to see the enum to use it, it could easily represent it (in effect) using anintas the underlying type. If the nativeinton your platform is 32-bit, that would explainsizeofgiving a result of 4. And, no, the size of enum types are not guaranteed to be 4. Their sizes are implementation defined - the standard is silent on the subject of what their size should be.