首页 > 其他分享 >位域和联合体的使用

位域和联合体的使用

时间:2023-06-16 09:12:05浏览次数:50  
标签:变量 联合体 unsigned char 数组 使用 位域 Bits

背景

在一次代码阅读中发现了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的地址是相对应的。

标签:变量,联合体,unsigned,char,数组,使用,位域,Bits
From: https://www.cnblogs.com/stack0verflow/p/17484711.html

相关文章

  • springboot 中使用 redis 处理接口的幂等性
    什么是接口幂等性?数学中:在一次元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同;在二次元运算为幂等时,自己重复运算的结果等于它自己的元素。计算机学中:幂等指多次操作产生的影响只会跟一次执行的结果相同,通俗的说:某个行为重复的执行,最终获取的结果是相同的,不会因......
  • 不要在#include中使用".."
    按照GoogleC++风格,不应该在#include中使用点号和双点号。例如:project/scr/base/logging.h应该这样包含:#include"base/logging.h"而不是这样:#include"../../../base/logging.h"这样就可以在包含目录配置中看到项目的依赖。如果允许#include使用“..”,任一文件都可以引用到任意......
  • 记录下闪回工具binlog2sql使用
    1查看系统[root@10-0-0-244~]#cat/etc/centos-releaseRockyLinuxrelease8.7(GreenObsidian)2下载MySQL2.1更新下版本[root@10-0-0-244~]#dnfupdateFailedtosetlocale,defaultingtoC.UTF-8Lastmetadataexpirationcheck:2:01:36agoonWedJun1403:59:26......
  • stack、vector的使用和特点
    Stack的方法stack是继承VectorclassStackextendsVector特点:栈模式----遍历时元素是先进后出具体代码实现:publicstaticvoidmain(String[]args){ Stack<String>stack=newStack<>(); //将元素添加到栈顶 stack.push("aaa"); stack.push("bbb"); stack......
  • HashSet、LInkedHashSet的使用和特点
    HashSet的使用Java中的HashSet是CollectionsFramework中的一个类。它允许您使用哈希表在集合中存储多个值。哈希表借助哈希机制以无序的方式存储值。导入java.util.HashSet包后,以下是在Java中创建HashSet的语法:HashSet<data_type>name=newHashSet(capacity,lo......
  • pikoboard与传感器的使用
    第一步下载pikoboard助手点我下载第二部链接pikoboard传感器为防止鳄鱼夹之间短路,使用公母线连接第三步测试一下“水量传感器”的数值变化范围海平面下降的时候,传感器数值会增大,海平面的中心点也会随着下降,故:【海平面中心的y坐标=0-180-传感器数值】第四步操作......
  • 使用MockMvc测试 Controller
    使用MockMvc可以做到controller层的测试。如果直接得到controller,然后调用指定的方法是不会通过拦截器等外层组件的,使用mockMvc可以。packagecom.lomi.mockMvc;importcn.hutool.json.JSONUtil;importcom.lomi.controller.TestController;importcom.lomi.entity.Goods;im......
  • Maven的基本使用
      编译  它会在maven你自己定义或者默认的的本地仓库中下载用来进行编译的插件 同时生成targrt文件夹来保存编译后的字节码文件 清理 会删除掉target文件,同时也会下载插件  打包  会生成target文件夹并且会把打包后的文件放在里面,也会下载插件......
  • celery笔记四之在Django中使用celery
    本文首发于公众号:Hunter后端原文链接:celery笔记四之在Django中使用celery这一篇笔记介绍一下如何在Django系统中使用celery。如果是想纯粹使用celery,这一篇笔记可以略过。本篇笔记目录如下:文件配置task定义运行worker1、文件配置我们这里使用前面的创建的hunt......
  • UE开发使用Rider时缓存干爆C盘的解决方案
    我们在使用Rider开发UE时,Ride会为每一个项目创建一个解决方案缓存,如果开几个新项目写测试demo,我们的C盘会逐渐捉急不知道官方怎么想的,默认在C盘就算了,还没法改目前没有找到这个路径相关的设置,只能另辟蹊径我们既然改不掉这个路径,那就将这个路径映射到其他路径上windows下,可以......