程序阅读!谢谢!!!

来源:百度知道 编辑:UC知道 时间:2024/05/27 17:32:03
#include"stdio.h"
void main()
{
union
{ int a[2];
long b;
char c[4];
}s;
s.a[0]=0x39;
s.a[1]=0x38;
printf("%lx\n",s.b);
printf("%c\n",s.c[2]);
}
帮我解释一下,谢谢

#include"stdio.h"
void main()
{
/*S是共同体,大小是8个字节(按最大的程序计算)*/
union
{
int a[2]; //8字节
long b; //4字节
char c[4]; //4字节
}s;

/* 通过成员a赋值 */
s.a[0]=0x39;
s.a[1]=0x38;
/*
赋值后的内存分布:(假设s的起始地址是0x2000,0000 并且机器是32位的小端地址)

标号: 内容: 地址:
a[0]/b/c[0] [ 39 ] 0x2000,0000
c[1] [ 00 ] 0x2000,0001
c[2] [ 00 ] 0x2000,0002
c[3] [ 00 ] 0x2000,0003
a[1] [ 38 ] 0x2000,0004
[ 00 ] 0x2000,0005
[ 00 ] 0x2000,0006
[ 00 ] 0x2000,0007
这是打印b,b就是[39][00][00][00],就是0x39。
如果打印c[2]就是[00],'/0'啥也没有。

*/

printf("%lx\n",s.b);
printf("%c\n",s.c[2]);
}

可能是类型转换吧。
对4字节的空间,按两个int型数来解释并赋值。
然后把这4个字节按long型数和字符数组来解释,输出该