枚舉類型大小與編譯器有關,在STM32平臺,kei 5編譯器,默認情況下枚舉類型的內存大小與枚舉的最大值的字節大小相同:
定義以下枚舉類型:
typedef enum
{
test00 =0x0,
test01
}Test0;
打印大小如下:
此處最大的枚舉值爲0x01,只需要1個字節就可以滿足需要,因此編譯器把此類型的大小隻用一個字節來保存!
再開下面的,最大值是0x100,超出0xFF,並且小於0xFFFF,猜測用2位字節表示即可!
typedef enum
{
test10 =0x0,
test11 = 0x100,
test12
}Test1;
結果如下:
猜測正確,2字節
再看:
typedef enum
{
test20 =0x0,
test21 = 0x10000,
test22
}Test2;
最大值是0x1000,超出0xFFFF,並且小於0xFFFFFFFF,猜測用4位字節表示即可!
結果如下:
猜測又正確,4字節
再看:
typedef enum
{
test30 =0x0,
test31 = 0x100000000,
test32
}Test3;
最大值是0x100000000,超出0xFFFFFFFF,並且小於0xFFFFFFFFFFFFFFFF,猜測用8位字節表示即可!
結果如下:
又對了,但是...
在kei5 平臺下,不運行超出4字節的枚舉類型,超出部分是未知的,比如我們打印出來test31的值,它並非0x100000000:
在我的電腦裏運行的值是0x6000D0,在你們的電腦可能又不一樣了。
實際上在定義這個值的時候,編譯器就警告了。
由此可以推出,在STM32平臺下,枚舉類型最大爲4字節,朋友們可以在其它平臺做測試(比如64位的WINDOWS系統!)
keil5 還可以直接強制設置所有枚舉型都是整形:
編譯後運行看看:
注意Test0、Test1、Test2變成4字節了,Test3還是8字節,但是它不可用。
因此:
1、枚舉類型大小與編譯器有關,在STM32平臺,kei 5編譯器,默認情況下枚舉類型的內存大小與枚舉的最大值的字節大小相同,但最大字節數不超過4字節,超出部分不可用,情況未知
2、可以通過編譯器設定,強制將任何一種枚舉型都轉爲4字節