C語言枚舉類型所佔字節大小實例解析

一 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個字節。

可見枚舉類型的大小會隨着其中的元素的大小而發生變化,雖然幾乎沒有人會用這麼大的數來作爲枚舉,但起碼我們得知道枚舉類型字節數的大小是有可能發生改變的,所以到程序中有數據需要和別的程序進行交流,譬如上位機和下位機的通信數據,就儘量不要在數據包中包含有枚舉類型,以免發生歧義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章