位域和联合体的使用
2023/6/16 14:23:45
本文主要是介绍位域和联合体的使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
背景
在一次代码阅读中发现了c语言的位域和联合体的联合使用,看的不是很明白,故做笔记记录。
开头
遇到的代码内容如下:
typedef struct _tag_Uart_Drv_Data { unsigned char a : 2; unsigned char b : 2; unsigned char c : 2; unsigned char d : 2; unsigned char e : 2; unsigned char f : 2; unsigned char g : 2; //4 5 2^4=16 unsigned char h : 2; unsigned char i : 2; unsigned char j : 2; unsigned char k : 2; unsigned char l : 2; unsigned char m : 2; unsigned char n : 2; unsigned char o : 2; unsigned char p : 2; unsigned char q : 8; unsigned char r : 8; unsigned char s : 8; unsigned char t : 8; unsigned char u : 8; } ; typedef union _tag_Uart_Drv_DataBuf { struct _tag_Uart_Drv_Data Bits; uint8_t _c[9]; //signa + checksum }uart_dev;
结论
在一番的查资料后了解到,这里使用了C语言中的位域(bit-field)分表表示给每个变量赋值长度为2bit或8bit的长度的内存空间。
让我们再次看到结构体下面的联合体(union)中定义的内容,这里有一个结构体定义的变量Bits
以及一个uint8_t型的数组_c
,由union的定义可知,这两个成员变量指向的是内存中的同一片区域,也就是说对这两个变量的读写,实际上是指向内存的同一片区域,换句话说,当我们在对Bits
中的成员变量进行改变时可以直接通过下面的数组来进行读,每8bit
代表其中数组的一个变量,故我们可以在Bits
中对成员变量赋值,在_c
中对改变的变量进行读操作,这样可以大大地提高数据的读效率,尤其是在串口通信中的信息传输时。
注意:这里的abcd 4位代表的是数组_c[0]
,因为这8位刚和数组下标0的地址是相对应的。
这篇关于位域和联合体的使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16MyBatis-Plus资料入门教程:快速上手指南
- 2024-11-16Mybatis资料入门教程:新手必看指南
- 2024-11-16MyBatis资料详解:新手入门与初级实战指南
- 2024-11-16MyBatisPlus资料:初学者入门指南与实用教程
- 2024-11-16MybatisPlus资料详解:初学者入门指南
- 2024-11-16MyBatisX资料:新手入门与初级教程
- 2024-11-16RESTful接口资料详解:新手入门指南
- 2024-11-16RESTful接口资料详解:新手入门教程
- 2024-11-16Spring Boot资料:新手入门与初级教程
- 2024-11-16Springboot资料:新手入门与初级教程