位段式结构体例题

cpp 复制代码
int main()
{
    unsigned char puc[4];
    struct man
    {
        unsigned char zhang;
        unsigned char san : 1;
        unsigned char shuai : 2;
        unsigned char bi : 3;
    }*dashuaibi;
    dashuaibi = (struct zs*)puc;
    memset(puc, 0, 4);
    dashuaibi->zhang = 2;
    dashuaibi->san = 3;
    dashuaibi->shuai = 4;
    dashuaibi->bi = 5;
    printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
    return 0;
}

代码中的结构体man中所有创建的变量都是一个无符号char类型。其中zhang占1个字节(byte),san占1个字节也就是8位(bit)中的1位(bit)还剩下7bit,接下来shuai又占了2bit还剩5bit,最后bi占走剩下的3bit。所以结构体man总共开辟了2个字节。

把puc这个数组的首元素地址赋给结构体变量dashuaibi。memset是用来初始化数组的值全为0。

接下来给man结构体里面的值进行赋值。

2, 3, 4, 5它们的二进制分别是:

将它们存放入数组中如下:

注:VS编译器是小端存储的上述地址存放是小端存储

%02x的意思是以16进制形式表示出2位,不够2位补0。

所以打印出来的应该就是 02 29 00 00

相关推荐
.格子衫.11 分钟前
032动态规划之区间DP——算法备赛
算法·动态规划
莫浅子17 分钟前
day01-USB架构与枚举
c++·单片机·嵌入式驱动
CSDN1211027 分钟前
麒麟 V10 安装 Node-RED、IEC 104 协议插件及界面汉化
linux·编辑器·vim
不会代码的小猴1 小时前
7. JSON
开发语言·c++·笔记·qt·算法·json
沫璃染墨1 小时前
《Qt从零入门系列(六):信号与槽进阶——从多种连接方式到Lambda表达式》
开发语言·c++·qt·代码规范·设计规范·qt5
怪奇云呼军1 小时前
知识库也会注入指令?闪电智能VoiceAgent 如何防住 Prompt Injection
人工智能·python·算法·云计算·音视频
晨枫阳2 小时前
@changesets/cli是什么?哪些情况下需要使用?怎么使用
linux·运维·ubuntu
阿里云大数据AI技术2 小时前
基于 EMR Serverless Ray 实现 Qwen 模型批量推理实践
人工智能·算法·agent
小小龙学IT2 小时前
ZeroMQ(libzmq)开源消息库深度解析:brokerless 时代的轻量消息内核
c++·开源