首页 > 其他分享 >共用体与位域 --20240310

共用体与位域 --20240310

时间:2024-03-10 16:24:32浏览次数:28  
标签:20240310 addr -- fields gpa int 位域 data sizeof

共用体 共用体(Union)是一种特殊的数据类型,它允许在同一个内存位置存储不同的数据类型。 共用体的所有成员共享同一块内存空间,因此同一时间只能存储其中一个成员的值。 共用体的定义和结构体类似,使用关键字union,后面跟着成员列表。每个成员可以是不同的数据类型,但共用体的所有成员都共享同一块内存空间,大小取决于最大的成员   共用体使用举例demo:

#include <string.h>

union Data {
        int i;
        float f;
        char str[20];
};

int main()
{
        union Data data;

        data.i = 10;
        printf("data.i = %d \n", data.i);
        printf("sizeof(data) = %ld \n", sizeof(data));

        data.f = 20;
        printf("data.f = %f \n", data.f);
        printf("sizeof(data) = %ld \n", sizeof(data));

        strcpy(data.str, "Hello");
        printf("data.str: %s\n", data.str);
        printf("sizeof(data) = %ld \n", sizeof(data));

        return 0;
}

// 执行结果
data.i = 10
sizeof(data) = 20
data.f = 20.000000
sizeof(data) = 20
data.str: Hello
sizeof(data) = 20

 

位域 寄存器的一个bit位在存储时并不需要占用一个完整的字节,只需要一个bit,用0和1表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种数据结构,叫做“位域”或“位段”。 位域的存储: 位域的存储遵循结构体内存对齐的原则,举个例子:
#include <stdio.h>

struct pack
{
        int a:2;
        int b:4;
        int c:6;
} a;

int main(void)
{
        printf("sizeof(a) = %d \n", sizeof(a));
        return 0;
}

// 执行结果
sizeof(a) = 4
a、b、c成员所占的位长之和在一个存储单元(此处为int类型所占的字节数)内,即4个字节内,所以struct pack类型的变量所占的字节长度为4个字节(实际a、b、c一共占用12bit,还有20bit空间为保留的空白)。此处要将内存对齐到 4 个字节(int类型所占的字节数),以便提高存取效率。   共用体和位域结合使用 寄存器操作时,共用体和位域结合使用十分方便,如下
#include <stdio.h>

union GPA_REG0 {
        int resval;
        struct {                                                                                                                                                                                                                 int bit0: 1;
                int bit1: 1;
                int bit2: 1;
                int bit3: 1;
                int bit4: 1;
                int bit5: 1;
                int bit6: 1;
                int bit7: 1;
                int bit8: 1;
                int bit9: 1;
                int bit10: 1;
                int bit11: 1;
                int bit12: 1;
                int bit13: 1;
                int bit14: 1;
                int bit15: 1;
        } fields;
};

union GPA_REG0 gpa_reg0;

void gpa_reg0_modify(union GPA_REG0 *addr)
                addr->fields.bit0 = 1;
                addr->fields.bit1 = 1;
                addr->fields.bit2 = 1;
                addr->fields.bit3 = 1;
                addr->fields.bit4 = 1;
                addr->fields.bit5 = 1;
                addr->fields.bit6 = 1;
                addr->fields.bit7 = 1;
                addr->fields.bit8 = 1;
                addr->fields.bit9 = 1;
                addr->fields.bit10 = 1;
                addr->fields.bit11 = 1;
                addr->fields.bit12 = 1;
                addr->fields.bit13 = 1;
                addr->fields.bit14 = 1;
                addr->fields.bit15 = 0;
}

int main()
{
        printf("gpa_reg0.resval = 0x%lx, sizeof(gpa_reg0) = %d \n", gpa_reg0.resval, sizeof(gpa_reg0));
        gpa_reg0_modify(&gpa_reg0);
        printf("gpa_reg0.resval = 0x%lx, sizeof(gpa_reg0) = %d \n", gpa_reg0.resval, sizeof(gpa_reg0));
}

// 执行结果
gpa_reg0.resval = 0x0, sizeof(gpa_reg0) = 4
gpa_reg0.resval = 0x7fff, sizeof(gpa_reg0) = 4

 

 

标签:20240310,addr,--,fields,gpa,int,位域,data,sizeof
From: https://www.cnblogs.com/lethe1203/p/18064309

相关文章

  • Assistants API
    AssistantsAPI允许您在自己的应用程序中构建AI助手。助手有指令,可以利用模型、工具和知识来响应用户查询。AssistantsAPI目前支持三种类型的工具:代码解释器、检索和函数调用。未来,我们计划发布更多OpenAI构建的工具,并允许您在我们的平台上提供自己的工具。您可以使用Assi......
  • 扩展BSGS/exBSGS
    先看这篇题解下面是一些注释首先,这篇题解的做法相当于是跟蓝书上插入查询的对象刚好反过来,也没有问题然后,是对这篇题解存前两个的解释首先是为什么会存在这个问题?我们考虑\(a^{p_1t}\)和\(a^{p_2t}\),其中\(p_1<p_2\)而且\(a^{p_1t}\equiva^{p_2t}(mod\:p)\)那么我们在枚举......
  • iframe嵌套(等宽高比自适应:aspectRatio)
     可以使用iframe引入外部网页<iframetitle="vimeo-player"src="https://player.vimeo.com/video/919942180?h=a56246711a"width="640"height="360"style={{width:'100%',aspe......
  • 学习笔记2(下)
    ......
  • 内存屏障 --20240310
    内存屏障(MemoryBarrier)是一种硬件或软件机制,用于协调并发访问共享资源时的数据一致性。它可以控制处理器和缓存对内存操作的顺序和时序,从而确保共享变量的读写操作按照预期方式进行。 在多线程或多核处理器系统中,为了避免竞态条件(RaceCondition)等问题,常常需要使用内存屏障来......
  • Dockerfile相关
    Dockerfile相关谁什么概念Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本步骤编写Dockerfile文件---->dockerbuild命令构建镜像---->dockerrun运行新镜像构建容器实例Dockerfile内容的基础知识或约定1.每条保留字指令都是......
  • 贪心算法
    例题1、硕鼠的交易题目描述ProblemDescription小老鼠准备了M磅的猫粮,准备去和看守仓库的猫做交易,因为仓库里有小老鼠喜欢吃的五香豆。仓库有N个房间;第i个房间有J[i]磅的五香豆,并且需要用F[i]磅的猫粮去交换;老鼠不必交换该房间所有的五香豆,换句话说,它可以用F[i]a%磅的......
  • 必看的2024年AI辅助研发发展趋势
    ​当我们站在2024年的风口浪尖时,人工智慧辅助研发的格局即将发生翻天覆地的变化。2023年人工智慧的快速发展为各行业的突破性进步铺平了道路。从研发流程的数位转型,到AI+开发工具2.0的出现,未来充满了超越Copilot领域的可能性。  需要关注的主要趋势: 1.**多模态革命:**......
  • 群星璀璨的Python江湖,Python第三方库介绍
    如果Python语言是一个江湖,那么python第三方库就是一个个身怀绝技的江湖侠客,这些侠客在这偌大的江湖尽情挥洒着江湖侠气。有人名扬天下,有人默默无闻,有人纵横捭阖,有人黯然谢幕,每天都在上演人生的悲欢离合。那么什么是python第三方库呢?什么是python第三方库python是一门非常流行......
  • 电路分析基础----运放里的虚短虚断
    令人稀里糊涂的虚短虚断想必好多人在学习硬件电路分析时,都会听到虚短虚断这个专业术语,但是对于新手玩家,这个术语不好理解,比如我自己,经常将这两个概念混淆。最近刷到大佬的视频,讲解的非常简洁易懂,特意做个小笔记!1.电子小白学不会运放?一开始掌握这两个用法就够了!2.如何理解运放的......