Fork me on GitHub

一 C语言中枚举所占多少字节呢?

  这个问题最近一个项目中,遇到了才进行总结。看来很多问题,踩坑了才知道珍惜啊。

二 实例解析

#include <stdio.h>

typedef enum {
    IIR_TYPE_LOW_SHELF = 0,
    IIR_TYPE_PEAK,
    IIR_TYPE_HIGH_SHELF,
    IIR_TYPE_LOW_PASS,
    IIR_TYPE_HIGH_PASS,
    IIR_TYPE_NUM
} IIR_TYPE_T;


typedef enum {
    IIR1_TYPE_LOW_SHELF = 0xfffffffff,
    IIR1_TYPE_PEAK,
    IIR1_TYPE_HIGH_SHELF,
    IIR1_TYPE_LOW_PASS,
    IIR1_TYPE_HIGH_PASS,
    IIR1_TYPE_NUM
} IIR1_TYPE_T;

int main()
{
        printf("sizeof IIR ENUM is:%d \n\r",sizeof(IIR_TYPE_T));
        printf("sizeof IIR ENUM1 is:%d \n\r",sizeof(IIR1_TYPE_T));

        return 0;
}

结果:

➜  enum_test git:(master) ✗ ./test
sizeof IIR ENUM is:4 
sizeof IIR ENUM1 is:8 

 

三  总结

A 枚举的大小是按照enum中元素最大值所占的内存大小来决定的,不像结构体那样有多少个元素就按各个元素所占字节叠加。

B 当枚举成员的值小于4个字节时,占4个字节。

C 当枚举成员的值大于4个字节时,最大只能是longlong类型,占8个字节。

可见枚举类型的大小会随着其中的元素的大小而发生变化,虽然几乎没有人会用这么大的数来作为枚举,但起码我们得知道枚举类型字节数的大小是有可能发生改变的,所以到程序中有数据需要和别的程序进行交流,譬如上位机和下位机的通信数据,就尽量不要在数据包中包含有枚举类型,以免发生歧义。

posted on 2024-05-18 16:29  虚生  阅读(553)  评论(0)    收藏  举报