一道C语言题目

2025-12-16 10:01:04
推荐回答(5个)
回答1:

  union 联合体
  union 联合体的特点是它所有的数据成员共用一个空间,同一时间只能存储一个数据成员
  一个union只配置一个只够打的空间老容纳最长的数据成员
  union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都相 对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存取都 是从union 的首地址位置开始
  所以在
  union pw
  { int i;
  char ch[2];
  } a ;
  最大长度是int,所以pw的空间大小就是int类型

  在分析楼主的代码之前,先介绍一下计算机排列数据的两个通用规则 1.大端法,2.小端法
  1.大端法:数据从最高有效字节到最低有效字节顺序排序
  2.小端法:数据从最低有效字节到最高有效字节顺序排序

  继续我们前面的分析
  假设pw的地址位于0x100处,且int类型的数据位32位
执行代码a.ch[0]=13;a.ch[1]=0后
其十六进制是0x0000 0013H

大端法的排列顺序是
0x100 0x101 0x102 0x103
00 00 00 13
而小端法的排列顺序是
0x100 0x101 0x102 0x103
13 00 00 00

注意:在0x0000 0013 中 高位字节是0x00,而低位字节是0x13

终上所述
如果楼主的计算机是以大端法排列数据的话
printf("%d\n",a.i);将输出0

如果是小端法的话
printf("%d\n",a.i);将输出13

若楼主有不明白的地方,可以追问

回答2:

1.共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。
2.当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度(以字节byte为单位,一个byte是8个二进制位)为联合中最长的数据类型长度的整数倍,例如
union foo
{
char s[10];
int i;
};
在这个union中,foo的内存空间的长度为12,是int型的3倍,而并不是数组的长度10。若把int改为double,则foo的内存空间为16,是double型的两倍。
3.综上可知,你定义的PW实际在内存中分配的空间是4个byte,因为int数据类型长度是4个byte,而char 字符型数据类型是一个byte。PW实际在内存中分配的空间示意图
0000 0000(4,最高位)
0000 0000(3)

0000 0000(2)

0000 0000(第一个byte,最低位)

4.于是a.ch[0]=13,实际占用的是第一个byte,实际存放方式是:0000 1101,a.ch[1]=0占用第二个byte,实际存放方式是:0000 0000,于是,最后输出结果是13
5.如果你将a.ch[1]=1,则第二个byte,实际数据是:0000 0001,于是,最后输出结果是1乘以(2的八次方) + 13 = 256 + 13 = 269,这事二进制的运算就不多说了。
6.如果对共同体还不是很了解,你可以看一下http://baike.baidu.com/view/109447.htm

回答3:

联合体,i和ch共享同一段内存,i是32为整型变量,ch是2个元素的字符数组,
正常小段存储模式下,先存低字节再存高字节,ch[0]是i的低字节那个位置,ch[1]是i的第二个字节的位置。

这里你只对ch[0],ch[1]赋值了,得假定其后两个字节值为0(可能你这里int是16位的,什么编译器呢?)。那么i对应内存下连续字节值为13 0 0 0,实际Int值就是13了

回答4:

只要你这机型是高于32位机(int所占字节2,或4),答案就是13
a.ch[0]=13;a.ch[1]=0,则内存中分布为0x000D,那么a.i的值就是0x000D即13

回答5:

输出结果为13啊