联合体嵌套结构体的问题
来源:互联网 发布:网络营销必备软件 编辑:程序博客网 时间:2024/06/05 10:32
原帖:http://bbs.csdn.net/topics/392021186?page=1
#include <stdio.h>
typedef union{
unsigned int u;
struct
{
unsigned char a :1;
unsigned char b :1;
unsigned char c :6;
unsigned char d :1;
} ST;
}UN;
int main()
{
UN.ST.u = 0;
UN.ST.a = 1;
UN.ST.b = 2;
UN.ST.c = 3;
UN.ST.d = 4;
printf("%d\n", UN.u);
return 0;
}
运行结果是13。
1)注意联合体的定义,就是组成联合体的变量共用一个空间。这个 例子中变量u和ST共用一个空间
2)现在用的pc机大多为小段结构,我的结果13也是在小段机测试的,如果架构改变,结果可能不同
3)基于小段结构,数据的低字节保存在内存的低地址中,ST占用9位(Bit),与变量u(32Bit)共用低位的9位
4)根据小段结构,变量a的地址应该最低,往后依次是b,c,d
5)un.u = 0; 执行这一步,变量所对应的空间二进制全部为0,即00000000 00000000 00000000 00000000
6)un.ST.a = 1;执行这一步,变量最后一位变化,即00000000 00000000 00000000 00000001
7)un.ST.b = 2;执行这一步,由于1位空间无法存储2,所以赋值被截断,原值不变
8)un.ST.c = 3;执行这一步,变量第3-8位发生变化,变量值变为00000000 00000000 00000000 00001101
9)un.ST.d = 4;执行这一步,由于1位空间无法存储4,所以赋值被截断,原值不变
10)所以最终的结果就是00000000 00000000 00000000 00001101
11)printf("%d\n", un.u); 输出结果就是13
能解释下“由于1位空间无法存储2,所以赋值被截断”是什么意思吗?
1. 结构中的u和ST是共用一段内存,所以你修改了u,则ST的内容自动变化,同样如果你修改了ST的内容,则u的内容也自动变化.这就是联合体
2. unsigned char a :1;这种定义方式,是按位进行定义的,即a只占用一个位,同样b和d都只占用一位,所以如果这三个变量你赋值大于1的话,则自动被截断为1位,即除了低1位有效之外,其它高位的全部被丢弃。按位定义的,和这个变量的类型相关性不是很大,所以不是说a被定义成char就是8位。
3. 由于是联合体,所以你的main()中对u赋值之后,再对a\b\c\d赋值,结果u就被修改掉了
- 联合体嵌套结构体的问题
- 关于结构体,联合体及内存大小的问题
- 结构体和联合体的内存对齐问题
- 结构体和联合体的字节对齐问题
- 结构体、联合体和位断的内存对齐问题
- 结构体联合体的字节对齐问题详解:
- 联合体里面的结构体
- 结构体,联合体的对齐
- 用结构嵌套联合体的方法建立高中学生成绩档案
- 结构体的嵌套问题
- 结构体的嵌套问题
- 结构体的嵌套问题
- 结构体的嵌套问题
- 结构体的嵌套问题
- 指针、结构体、联合体的安全规范
- 结构体、联合体、枚举的特性
- 指针、结构体、联合体的安全规范
- 指针、结构体、联合体的安全规范
- LabView中串口通信读取数据出现乱码的情况说明
- 如何获取到Android控件的高度
- SuperExample之主页的搭建实现底部的TabLayout
- 【修真院“善良”系列之十六】代码结构中Dao,Service,Controller,Util,Model是什么意思,为什么划分
- 使用Kotlin如何startActivity
- 联合体嵌套结构体的问题
- 自定义视图
- 欢迎使用CSDN-markdown编辑器
- Rxjava结合操作符—merge、 Join
- 英语翻译
- matlab 四舍五入 保留至指定小数
- stratum协议原理
- 测试
- 单例模式--饿汉模式