求联合体中整型变量的值

来源:互联网 发布:闲鱼上推淘宝客链接 编辑:程序博客网 时间:2024/06/06 20:40

union A

{

   int i;

   char b[2];

};

A a;

a.b[0] = 10 ;

a.b[1] = 1;

求 cout<<a.i 的输出

 

     这道题目的考察点是联合体中成员的内存存储方式。

     首先清楚要清楚一个概念,联合体中的变量是公用一块内存,大小取决于这个联合体中占用空间最大的变量类型的整数倍。A里面int i 占用4字节,char b[2] 占用2个字节,那么A的内存空间长度为4字节(如果是char b[5],那么A的内存空间长度为8字节)

     那现在已经清楚了对象a的内存大小为4字节,那么经过 a.b[0] = 10;a.b[1] = 1;这两步操作后,a的内存空间的前2个字节,即前16位的样子大致应该为0000 0001 0000 1010 (默认小端模式) ,也就是说i的前2个字节的值等于十进制的266。如果把题目中的i的类型改为short,那么这道题目的答案就是266。

    可是由于int占4位,那么i的后16位值是什么呢?这就由a的类型决定,如果a是全局或者静态变量,那么a的内存空间会被默认初始化为0,也就是i的二进制值为 0000 0000 0000 0000 0000 0001 0000 1010 ,那么最终的输出还是十进制266,但如果a是一个局部非静态变量,那么他的成员变量将不会被初始化,是随机的垃圾数据,比如0xcd,0xcc之类的,这样一来,虽然i的前2个字节的值我们已经知道了,但由于后2个字节的值是随机数据,我们没有办法知道最后a.i的值是多少,在我本人的机器上的结果就是个负数。

   

原创粉丝点击