使用枚举是一个避免在程序中出现幻数的好方法,应该在代码中避免出现未解释的数值。在单片机编程中,尤其是在编写通信协议时,常常使用枚举来定义诸如命令等字段。这时有个问题就必须要提出了,C语言中类型到底占多少字节?我们给命令字段预留的字节大小必须和类型大小一致才能保证通信协议在字节流层面上正确。
关于类型究竟占用多少字节,答案是不确定。C语言标准规定枚举必须是整数类型,但却没有规定枚举类型必须占多少字节。枚举类型占用多少字节,取决于每个编译器的实现。有可能占8字节,16字节,32字节,甚至64字节。其他编译器我们不做讨论,下面只介绍 MDK中enum类型大小的问题。
MDK中对enum类型大小的分配原则是能够包含所有枚举元素的最小整形,即刚好够用的整形实现。什么意思呢?就是如果一个unsigned char能够包含枚举元素的所有情况,那就用unsigned char作为其大小。如果要unsigned int才能包含的话,那就以unsigned int作为其大小。下面用代码直观体现一下:
在char能包含枚举元素的情况下枚举大小为1字节
在int能包含枚举元素的情况下枚举大小为4字节
上面只是简单说明。对于enum类型的大小和符号, MDK有更详细的规定。在C模式或者不带--enum_is_int的C++模式下,如果枚举元素只包含正整数,那么enum的存储类型为下表第一个能匹配元素数值的unsigned类型。在其他模式或者枚举元素有负数的情况下,enum的存储类型为下表第一个匹配元素数值的signed类型:
unsigned char if not using --enum_is_int
signed char if not using --enum_is_int
unsigned short if not using --enum_is_int
signed short if not using --enum_is_int
signed int
unsigned int except C with --strict
signed long long except C with --strict
unsigned long long except C with --strict.