运行以下代码,看一看输出的结果是什么?
#include <stdio.h>
int main(){
union key{
int k;
char ch[2];
}u;
u.k = 258;
printf("%d %d\n",u.ch[0],u.ch[1]);
return 0;
}
运行结果:
从运行的结果中可以看出,ch[0]的值为2,ch[1]的值为1。为什么呢?
共用体的特点为:共用体可以将不同数据类型的值放在同一个内存空间中,现实在一个存储区根据程序执行的不同需求读写不同类型的数据。所有成员共用一块内存空间,其首地址相同。共用体变量与其各成员变量的内存地址相同。共用体变量所占内存大小为成员当中占内存最大的那个变量的大小。
给u.k赋值为258,ch[0]的值为2,ch[1]的值为1。为了找出其规律,可以多试几个数:
#include <stdio.h>
int main(){
union key{
int k;
char ch[2];
}u;
printf("%d\n",sizeof(u)); //输出u所占的字节数
int i = 0;
while(1){
scanf("%d",&u.k);
printf("%d %d\n",u.ch[0],u.ch[1]);
i++;
if(i==100){
break;
}
}
return 0;
}
运行:
u所占的字节数为4,也就是成员中占字节数最大的int的字节数。4个字节32位。根据以上输入输出结果,列出对应数字的二进制:
第一个输入为0,int类型,二进制为:0000 0000 0000 0000 0000 0000 0000 0000
char类型占1个字节,其对应该二进制数的后八位,所以char的值为0。而char[1]对应该二进制数的倒数第二个后八位,所以ch[1]的值也为0.
第二个输入为1,二进制数为:0000 0000 0000 0000 0000 0000 0000 0001
,根据前面的对应结果,ch[0]的值为1,ch[1]的值为0.
直到输入127,对应的二进制数为:0000 0000 0000 0000 0000 0000 0111 1111
,ch[0]的值为127,ch[1]的值为0
输入128,对应的二进制数为:0000 0000 0000 0000 0000 0000 1000 0000
,ch[0]的值为-128,因为char的存储数值范围在-128~127,1000 0000
最高为符号位为1,所以这个数为负数,减1得到反码为0111 1111
,再取反得到数值1000 0000
,所以为-128。而ch[1]的值为0.
输入129,对应的二进制数为:0000 0000 0000 0000 0000 0000 1000 0001
,ch[0]的值为-127,其二进制为1000 0001
,最高位为1,所以为负数。减1得到反码为1000 0000
,取反得到数值为0111 1111
,所以ch[0]的值为-127。ch[1]的值依旧为0.
输入255,对应的二进制数为:0000 0000 0000 0000 0000 0000 1111 1111
,ch[0]的值为-1,其二进制为1111 1111
,最高位为1,所以为负数。减1得到反码为1111 1110
,取反得到数值为0000 0001
,所以ch[0]的值为-1。ch[1]的值此时依旧为0.
输入256,对应的二进制数为:0000 0000 0000 0000 0000 0001 0000 0000
,此时后八位的数值为0,所以ch[0]的值为0. 倒数第二个后八位为0000 0001
,也就是ch[1]的数值,为1.
输入257,对应的二进制数为:0000 0000 0000 0000 0000 0001 0000 0001
,后八位0000 0001
为ch[0]的数值,为1. 倒数第二个后八位ch[1]的值也为1.
… …
由此就可以得到共用体变量的数值规律。
修改代码,如下:
#include <stdio.h>
int main(){
union key{
int k;
char ch[4];
}u;
printf("%d\n",sizeof(u));
int i = 0;
while(1){
scanf("%d",&u.k);
printf("%d %d %d %d\n",u.ch[0],u.ch[1],u.ch[2],u.ch[3]);
i++;
if(i==100){
break;
}
}
return 0;
}
如果输入34752536,对应的二进制数为:0000 0010 0001 0010 0100 1000 0001 1000
,那么就可以得到ch[0]的值为24,ch[1]的值为72,ch[2]的值为18,ch[3]的值为2。那么运行一下检验结果:
由结果可以看出,确实如此。