博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++联合体详解
阅读量:2289 次
发布时间:2019-05-09

本文共 1057 字,大约阅读时间需要 3 分钟。

代码如下:

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 un;    un.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

unsigned char a :1;这种定义方式,是按位进行定义的,即a只占用一个位,同样b和d都只占用一位,所以如果这三个变量你赋值大于1的话,则自动被截断为1位,即除了低1位有效之外,其它高位的全部被丢弃。按位定义的,和这个变量的类型相关性不是很大,所以不是说a被定义成char就是8位。

转载地址:http://bfbnb.baihongyu.com/

你可能感兴趣的文章
Android 搭建
查看>>
Java 配置
查看>>
多个Activity的完全退出
查看>>
自定义android控件
查看>>
tomcat c/s 三层架构
查看>>
代码_多进程_简单实例
查看>>
转载_消息机制
查看>>
代码_网络_FTP
查看>>
代码_网络_WWW
查看>>
UIView常用属性和函数
查看>>
UIButton常用属性和函数详解
查看>>
UILabel常用属性详解
查看>>
UITextField常用属性和方法详解
查看>>
“UITableView完美平滑滚动”阅读笔记
查看>>
UIImageView常用属性和方法
查看>>
UIImage常用属性和方法
查看>>
会报编译器警告的Xcode 6.3新特性:Nullability Annotations
查看>>
2015 Objective-C 三大新特性
查看>>
Objective-C中instancetype详解
查看>>
音频、视频框架概括说明
查看>>