C语言位域定义与使用

参考文章:

【C语言】详解位域定义与使用_c 语言定义位-CSDN博客

代码有修改,主要是变量初始化,原程序可能相应内存不能写。且第二个字节F不好区分各位。

#include <stdio.h>typedef struct
{unsigned short b1 : 1;unsigned short b2 : 3;unsigned short : 4;unsigned short b3 : 4;
}Bit_t;typedef union
{unsigned short _2byte;unsigned char byte;Bit_t bit;
}U_t;int main()
{U_t* pu;int a = 1;//pu = (U_t*)0x12345678;//假设寄存器的地址为0x12345678;pu = (U_t*)(&a);pu->_2byte = 0xD0C;//以2个字节的方式写入数据到寄存器printf("b1 = %u\n", pu->bit.b1);//读出数据printf("b2 = %u\n", pu->bit.b2);printf("b3 = %u\n", pu->bit.b3);return 0;
}

调试运行结果:

原文中对各位域在内存中分布写的很明白,但有一个地方没写,即是各位域内部的位和原short型数据各位怎么对应。

先给规则:

字节的高低,是按照从左到右顺序(小端存储),取各位操作时,先按照字节顺序,先取低字节再取高字节,即从右向左取,即是反过来取的。

而在每个字节内部,也是按照从左到右放置各位,位域取位操作时,又是先取低位再取高位,即从右向左取,也是反过来的。

但是,在取完后放置时,却是需要再反一下,即先取的放低位,后取的放高位,即取出数据和位对应的原数据,高低位翻转了!

再举例:

如这里short型对应两个字节,即联合体是两个字节的。pu指向的联合体放置两个字节0xD0C时,先放低字节,再放高字节。即,第一个字节是0C,第二个字节是D。

每个字节按照位展开依次是:

0000 1100

0000 1101

则b1是第一个字节的第8位(最低位),即为0。

b2是第一个字节的第7位到第5位(取的顺序依然是从低到高),即0 1 1,但是结果却是110,即6。

b3是第二个字节的低4位(取的顺序依然是从低到高),即1 0 1 1,结果却是1101,即13。

所以取出后需要再反一下!

其实也是因为先取的是原数据的低位,后取的是高位,所以放的时候,也是从右往左放,所以最终结果是高低位和取的顺序是反的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412307.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rust获取本地外网ip地址的方法

大家好&#xff0c;我是get_local_info作者带剑书生&#xff0c;这里用一篇文章讲解get_local_info的使用。 get_local_info是什么&#xff1f; get_local_info是一个获取linux系统信息的rust三方库&#xff0c;并提供一些常用功能&#xff0c;目前版本0.2.4。详细介绍地址&a…

LeetCode面试题02.07链表相交

力扣题目链接 思想&#xff08;数学&#xff09;&#xff1a;设链表A的长度为a&#xff0c;链表B的长度为b&#xff0c;A到交点D的距离为c&#xff0c;B到交点D的距离为d。显然可以得到两者相交链表的长度为&#xff1a;a - c b - d ,变换一下式子得到&#xff1a;a d b …

高效除甲醛 污染物 光触媒 5nm石墨烯二氧化钛粉CY05S

商品描述 技术指标&#xff1a; 项目 指标 型号 CY05S 粉末外观 蓝黑色粉体 粒径 <5nm 含量 99% 表面性质 亲水 使用方法&#xff1a; 把CY05S粉用蒸馏水&#xff0c;去离子水等&#xff0c;做成固含为1-2%的水溶液&#xff0c;喷涂于墙壁&#xff0c;天花板&a…

什么是身份治理和管理(IGA)

员工的数字身份在组织阶梯内移动时可能会发生变化&#xff0c;将对用户帐户应用与访问相关的修改的过程往往会变得费力且耗时&#xff0c;其强度与组织的人数成正比&#xff0c;为了简化用户身份管理&#xff0c;组织实施了身份治理和管理。 身份治理和管理&#xff08;IGA&am…

Java 方法中参数类型后写了三个点?什么意思?

1、...代表什么意思&#xff1f; 2、如何使用 3、注意事项 4、两个list&#xff0c;一个新的&#xff0c;一个旧的&#xff0c;旧列表中可能有新列表中存在的数据&#xff0c;也可能存在新列表中不存在的数据&#xff08;注&#xff1a;新旧列表中都不存在重复元素&#xff09;…

铝壳电阻有哪些特点和优势?

铝壳电阻是一种常见的电子元件&#xff0c;广泛应用于各种电子设备中。它具有许多特点和优势&#xff0c;使其在众多电阻类型中脱颖而出。以下是铝壳电阻的一些主要特点和优势&#xff1a; 散热性能好&#xff1a;铝壳电阻的外壳采用铝合金材料制成&#xff0c;具有良好的散热性…

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(一)

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(一)。 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。在不同的书籍上, 不同的作者, 对于架构的定义也不统一, 角度不同, 定义不同。 一、架构是什么 Linux 有架构,MySQL 有架构,J…

YOLOv8在NX上的tensorrt的加速部署(60帧率)

所需环境 所有过程均可以参考本人所写的文章 (1)虚拟环境工具 MInforge3-Linux-aarch64 Jetson 平台都是RAM架构,平常的conda都是基于X86架构平台的。环境搭建参考文章 (2)YOLOv8_ros代码,采用自己创建的yolov_ros代码。yolov8_ros参考文章 (3)jetpack 环境(本篇文章…

如何运用工业智能网关将数据上传到设备数字化平台

在工业4.0和智能制造的时代背景下&#xff0c;设备数字化平台已经成为了企业实现高效、智能生产的关键。在这个过程中&#xff0c;工业智能网关发挥着至关重要的作用&#xff0c;它们作为连接设备与数字化平台的桥梁&#xff0c;是推动工业自动化的重要力量。 一、工业智能网关…

有什么办法解决vcruntime140_1.dll无法继续执行代码

在使用电脑的过程中你是否遇到过vcruntime140_1.dll丢失的问题&#xff1f;如果给你的电脑提示vcruntime140_1.dll无法继续执行代码&#xff0c;那么这将会影响你的电脑中一些程序&#xff0c;这可能会影响你的电脑正常使用&#xff01;那么有什么办法可以解决vcruntime140_1.d…

linux基础学习(4):rpm包与相关命令

1.linux内的软件包分类 linux只有2种软件包&#xff1a;源码包 与 二进制包 &#xff08;1&#xff09;源码包 源码包就是开源的源程序包&#xff0c;使用者可以直接看到其程序&#xff0c;也可以进行修改 &#xff08;2&#xff09;二进制包 由于源码包安装难度大&#x…

软件测评中心▏正式验收测试和非正式验收的优缺点简析

软件正式验收测试需要非常严格的管理&#xff0c;是对系统测试的延续&#xff0c;这种验收测试的测试用例应是系统测试的子集。非正式验收测试不像正式验收测试那么严格&#xff0c;不需要执行指定的测试用例&#xff0c;可以由测试人员自主决定&#xff0c;但制定测试用例时必…