位段式结构体例题

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

相关推荐
楚枫默寒2 小时前
Linux 编辑文件后自动添加修改日期
linux·运维·bash
8Qi84 小时前
LeetCode 75:颜色分类(荷兰国旗问题)—— Java 题解 ✅
java·算法·leetcode·指针·排序
2601_961194024 小时前
27考研刘晓艳单词pdf
linux·sql·ubuntu·华为·pdf·.net
888CC++5 小时前
如何在 C 语言中进行程序调试?
前端·javascript·算法
2023自学中6 小时前
imx6ull 开发板 推流ov5640数据,虚拟机用 ffplay 拉流播放
linux·音视频·嵌入式·开发板
shandianchengzi6 小时前
【记录】Ghidra|Ubuntu 26.04 下 Ghidra 界面缩放完整指南
linux·ubuntu·逆向·ghidra
Soari6 小时前
Ubuntu 根分区文件系统损坏,系统启动时自动检查失败
linux·运维·ubuntu
(●—●)橘子……7 小时前
力扣第503场周赛练习理解
python·学习·算法·leetcode·职场和发展·周赛
杨云龙UP7 小时前
Oracle Health Check巡检脚本使用SOP V2.0:从HTML原始报告→生成Word专业巡检报告→交付客户_2026-06-03
linux·运维·数据库·sql·oracle·报告·巡检