enum类型变量强制转换为uint_16类型,是向上转换,还是向下转换?

文章探讨了C语言中enum类型在内存分配上的特点,通过实验比较了enum类型和uint_16类型在内存占用上的差异,发现enum变量占用4字节,适合uint_16转enum类型以减少精度损失。
摘要由CSDN通过智能技术生成

1. 重新认识enum类型

C语言中,enum类型可以用来定义常量,且可以自动累加变量值,在方便程度上,易于使用宏定义。因此,enum类型在较多场景中使用。
使用方式如下:

typedef enum 
{
    UART_MSG_CMD_OPEN =0, 
    UART_MSG_CMD_CLOSE, 
    UART_MSG_CMD_START,
    UART_MSG_CMD_STOP,
    UART_MSG_CMD_MAX
}eUARTMSGCMD;

2. 问题

但以往对于enum类型变量内存分配空间没有概念,最近在修改MISRA问题中遇到此问题。
是enum类型变量强制转换为uint_16类型好,还是uint_16类型变量强制转换为enum类型变量好?
也就是文章标题所说的问题,类型强制转换,默认的原则,是向上转换,也就是在内存空间够用的情况下,尽量使用大类型变量,以减少精度损失。
换言之,enum类型变量,uint_16类型变量,哪种类型变量占用内存空间大?
我们做如下实验

int main(void)
{
    unsigned short iMsgId;
    iMsgId = 11;
    eUARTMSGCMD eMessageId = (eUARTMSGCMD)iMsgId;
    eUARTMSGCMD eMessageIdMax = UART_MSG_CMD_MAX;
    printf("eMessageId:%d, eMessageMax: %d\n", eMessageId, eMessageIdMax);
    printf("sizeof(eUARTMSGCMD):%lu, sizeof(unsigned short): %lu\n", sizeof(eUARTMSGCMD), sizeof(unsigned short));
    return 0;
}

程序编译,运行。结果如下:

root@localhost:~/testWorkSpace/enum$ cmake --build build/
Scanning dependencies of target enum
[ 50%] Building CXX object CMakeFiles/enum.dir/main.cpp.o
[100%] Linking CXX executable enum
[100%] Built target enum
root@localhost:~/testWorkSpace/enum$ ./build/
CMakeFiles/ enum
root@localhost:~/testWorkSpace/enum$ ./build/enum
eMessageId:11, eMessageMax: 4
sizeof(eUARTMSGCMD):4, sizeof(unsigned short): 2

运行结果说明,enum类型的变量占用地址空间为4个字节,uint_16强制转换为enum类型变量较妥。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值