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