
位段 + 枚举 + 联合体讲解
发布日期:2021-05-19 16:31:17
浏览次数:18
分类:精选文章
本文共 2566 字,大约阅读时间需要 8 分钟。
文章目录
前言
本文将介绍位段、枚举和联合体等相关概念,建议读者先熟悉前文内容。
一. 位段
(1). 位段介绍
位段的结构与普通结构类似,但其成员必须是int、unsigned int、signed int、char或unsigned char类型,并带有指定位数的标量。
struct A { unsigned int a:2; unsigned int b:5; unsigned int c:10; unsigned int d:30; };
(2). 位段内存分配
#include
int main() { struct S { char a : 3; char b : 4; char c : 5; char d : 4; }; struct S s = {0}; s.a = 10; s.b = 12; s.c = 3; s.d = 4; printf("%d\n", s); printf("%d\n", sizeof(s));} 位段的内存分配基于需要,整字节对齐,padding到最接近的字节边界。
(3). 位段的局限性
- 符号性难以确定
- 位数固定,需考虑平台兼容性
- 内存分配模式不统一
- 跨字段结构分配时易导致位数丢失
(4). 练习题解答
(1)
#define MAX_SIZE A+Bstruct _Record_Struct { unsigned char Env_Alarm_ID : 4; unsigned char Para1 : 2; unsigned char state; unsigned char avail : 1;}*Env_Alarm_Record;struct _Record_Struct *pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);
计算结果:sizeof(struct _Record_Struct)=3,总空间为9
(2)
#include int main() { unsigned char puc[4]; struct tagPIM { unsigned char ucPim1; unsigned char ucData0 : 1; unsigned char ucData1 : 2; unsigned char ucData2 : 3; }*pstPimData; pstPimData = (struct tagPIM*)puc; memset(puc,0,4); pstPimData->ucPim1 = 2; pstPimData->ucData0 = 3; pstPimData->ucData1 = 4; pstPimData->ucData2 = 5; printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]); return 0;}
打印结果:02 29 00 00
二. 枚举
枚举类型用于定义一系列取值,通常用于常量表示。默认取值从0开始,但可自定义初始值。
enum Day {Mon, Tues, Wed, Thur, Fri, Sat, Sun};enum Sex {MALE, FEMALE};enum Color {RED=1, GREEN=2, BLUE=4};
三. 联合体
(1). 联合体介绍
联合体变量包含多个成员,共用同一块内存空间。
union Un { char c; int i;};union Un un;printf("%p\n", (void*)un.i);printf("%p\n", (void*)un.c);un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);
打印结果:11223355
(2). 联合体计算
union Un1 { char c[5]; int i;};union Un2 { short c[7]; int i;};printf("%d\n", sizeof(union Un1)); // 8printf("%d\n", sizeof(union Un2)); // 16
(3) 例子解析
#include union Un { short k; char i[2];} *s, a;s = &a;s->i[0] = 0x39;s->i[1] = 0x38;printf("%x\n", a.k);
打印结果:3839
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年05月01日 11时39分59秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
10个高级的 SQL 查询技巧,你掌握了几个?
2023-01-24
ELK原理与介绍(转)
2023-01-24
ELK学习笔记(三)单台服务器多节点部署
2023-01-24
ELK应用日志收集实战
2023-01-24
elTable火狐浏览器换行
2023-01-24
15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了
2023-01-24
0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏)
2023-01-24
100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了
2023-01-24
10个程序员可以接私活的平台
2023-01-24
10个程序员可以接私活的平台(非常详细)零基础入门到精通,收藏这篇就够了
2023-01-24
10条sql语句优化的建议
2023-01-24
10款宝藏编程工具!新手必备,大牛强烈推荐! 从零基础到精通,收藏这篇就够了!
2023-01-24
10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了
2023-01-24
15个Python数据分析实用技巧(非常详细)零基础入门到精通,收藏这一篇就够了
2023-01-24
15个备受欢迎的嵌入式GUI库,从零基础到精通,收藏这篇就够了!
2023-01-24
15个程序员常逛的宝藏网站!!从零基础到精通,收藏这篇就够了!
2023-01-24
1分钟学会在Linux下模拟网络延迟
2023-01-24