【C编程问题集中营】枚举类型变量赋值超过其定义数值的表现
关注且发送"102"即可获取完整全文内容;
一、问题背景以及测试
1.1 测试环境
在以下测试环境进行测试:
- 通过ghs的交叉编译器编译后在RH850芯片上面进行调试;
1.2 测试细节
枚举类型大家应该都比较熟悉,定义三个枚举类型如下所示:
typedef enum {
E_TEST_ENUM_TYPE_0_0 = 0,
E_TEST_ENUM_TYPE_0_1 = 1,
E_TEST_ENUM_TYPE_0_2 = 2,
E_TEST_ENUM_MAX_0_3
} E_TEST_ENUM_TYPE0_DATA;
typedef enum {
E_TEST_ENUM_TYPE_1_0 = 0,
E_TEST_ENUM_TYPE_1_1 = 1,
E_TEST_ENUM_TYPE_1_2 = 2,
E_TEST_ENUM_MAX_1_3 = 127
} E_TEST_ENUM_TYPE1_DATA;
typedef enum {
E_TEST_ENUM_TYPE_2_0 = 0,
E_TEST_ENUM_TYPE_2_1 = 1,
E_TEST_ENUM_TYPE_2_2 = 2,
E_TEST_ENUM_MAX_2_3 = 128
} E_TEST_ENUM_TYPE2_DATA;
从代码层面来看这三个枚举类型的不同点都在于第四个枚举宏的值不同,E_TEST_ENUM_MAX_0_3
按照枚举特性应该等于4,E_TEST_ENUM_MAX_1_3
如定义等于127,E_TEST_ENUM_MAX_2_3
如定义等于128,下面根据这三个枚举类型定义三个不同的枚举变量,定义如下:
E_TEST_ENUM_TYPE0_DATA EnumType0Data = E_TEST_ENUM_TYPE_0_0
E_TEST_ENUM_TYPE1_DATA EnumType1Data = E_TEST_ENUM_TYPE_1_0;
E_TEST_ENUM_TYPE2_DATA EnumType2Data = E_TEST_ENUM_TYPE_2_0;
接下来将这三个枚举变量分别赋值0xFF,也就是如文章标题所说将枚举类型变量对其赋予超过其定义的数值,然后通过调试变量窗口观测这三个值的变化,赋值如下:
EnumType0Data = 0xFF;
EnumType1Data = 0xFF;
EnumType2Data = 0xFF;
将此部分代码通过ghs交叉编译器编译后,烧录到RH850 demo上面进行调试,观测这三个变量的数值,数值分别如下所示:
- EnumType0Data(type: E_TEST_ENUM_TYPE0_DATA) = -1;
- EnumType1Data(type: E_TEST_ENUM_TYPE1_DATA) = -1;
- EnumType2Data(type: E_TEST_ENUM_TYPE2_DATA) = 255;
二、测试结论
从上述测试结果可以得出以下结论:
- 枚举类型的变量是一个有符号的变量;
- 当枚举类型中的值大于0,小于等于127时,这个枚举类型相当于int8类型,所以赋值0xFF就变成了-1,如果当枚举类型中的值大于127为128时,int8范围(+127~-128)已经不能表示128,所以此时的枚举类型就相当于int16类型,所以0xFF就表示为255,不会被认为是负数处理;
- 在使用枚举变量时,对其进行赋值操作时一定要在定义的范围内进行赋值;
当我尝试用Microsoft Visual Studio的gcc进行编译时,发现编译直接会报错,所以严格来说,这种赋值操作是不允许的。
“如果你喜欢这篇文章,请关注我们,未来还有更多精彩等着你。”