联合体的难题

http://blog.csdn.net/liyzh_inspur/article/details/2972381

 第一题: 
#include <stdio.h> 
union 

int i; 
char x[2]; 
}a; 
void main() 

a.x[0] = 10; 
a.x[1] = 1; 
printf("%d",a.i); 

答案:266

解析:

C语言中的联合体(UNION)的概念是,联合体中的多种数据类型共享同一个内存空间。就拿你举的例子来说: 
     在联合体a中定义了两种数据类型,字符数组x以及整形变量i.其中整形变量是16位的,数组大小为2的字符数组为8X2=16位。如此一来,编译器便会为联合体a在内存中开辟一个16位的空间,这个空间里存储联合体的数据,但是这个空间只有16位,它既是整形变量的数据,也是字符数组的数据。如果你的程序从字符数组的角度解析这个空间,那么它就是两个字符,如果你的程序从整型的角度解析这个空间,那么它就是一个整数。 
     以你的程序为例子,现在已经开辟了一个16位的空间,然后我们假定现在空间还没有被赋值,为: 
     00000000 00000000 
    那么在运行完代码 
    a.x[0] = 10; 
    a.x[1] = 1; 
    之后,16位的空间变为: 
     00001100 00000001 
    然后程序运行 
    printf("%d",a.i); 
    就是把联合体a当成一个整数来解析,而不是字符串数组。那么这样一来,程序就把这16位变成了一个完整的整数: 
    (00000001 00001100)二进制 = (266)十进制 
    注意,你可以看到程序在把16位弄成整数的时候把后面八位放在了前面,前面八位放在了后面。这个反序是计算机存储结构造成的,这个和联合体没有直接关系。如果感兴趣的话可以参考汇编语言。 
    就是这个道理。


第二题: 
main() 

union{ /*定义一个联合*/ 
int i; 
struct{ /*在联合中定义一个结构*/ 
char first; 
char second; 
}half; 
}number; 
number.i=0x4241; /*联合成员赋值*/ 
printf("%c%c/n", number.half.first, mumber.half.second); 
number.half.first='a'; /*联合中结构成员赋值*/ 
number.half.second='b'; 
printf("%x/n", number.i); 
getch(); 

答案: AB

解析:

  • 黄小非
  • 等级:
发表于:2008-03-30 15:48:125楼 得分:0
第二个例子同样, 
union{ /*定义一个联合*/ 
    int i; 
    struct{ /*在联合中定义一个结构*/ 
        char first; 
        char second; 
    }half; 
}number; 

定义了联合体number,这个联合体有两种数据类型,整形i(16位),以及一个结构体(struct half)(2个char,16位)。所以编译器为这个联合体开辟一个16位的空间: 
00000000 00000000 
然后赋值: 
number.i=0x4241; 
这个时候,联合体以整形的身份出现,16位的空间将被整体认为是一个整数赋值。 
注意(0x4241)(16进制) = (01000010 01000001)二进制。还记得刚才说的,计算机存储的时候是反着存的吗,先存低位,再存高位(参考汇编语言),因此16位地址被赋值位 
01000001 01000010 
然后 
printf("%c%c/n", number.half.first, mumber.half.second); 
实际上是把16位空间以结构体half的角度解析,也就是两个char. 
那么第一个:number.half.first = (01000001)二进制 = (65)十进制 = A(ASCII码) 
同理number.half.second = B(ASCII码) 
当然后头又给first和second赋值位"a"和"b",这样会把16位空间弄成是: 
01100001 01100010 
然后用 
printf("%x/n", number.i); 
就是把16位看成整数,记住高地位反过来 
(01100010 01100001)二进制 =   (0X6261)16进制 
所以结果就是:0x6261. 

getch(); 
最后记得按任意键结束程序。

你可能感兴趣的:(联合体的难题)