【考研复习】union有关的输出问题

文章目录

  • 遇到的问题
  • 正确解答
  • 拓展
  • 参考文章

遇到的问题

首次遇到下面的代码时,感觉应该输出65,323。深入理解union的存储之后发现正确答案是:67,323.

union
{
    char c;
    int i;
} u;
int main(){
	u.c = 'A';
    u.i = 0x143;
    printf("%d,%d\n", u.c, u.i);
}

正确解答

对union首先明确几点:

  1. union共用存储空间,后赋值的数据会将前面赋值的进行覆盖。
  2. 存储时,要求高地址在后,地址值在后。
  3. 存储空间大小为共用体成员中长度最长的成员的size。

上例可知共用体u中有两个成员i和c分别占用4个字节和2个字节,故u占用4个字节。
首先将A存入u中,字符A对应二进制为01000001。存储如下图所示:
【考研复习】union有关的输出问题_第1张图片再将十六进制143存储u,该数对应二进制101000011。存储如下图所示:
【考研复习】union有关的输出问题_第2张图片
后面的0x143将第一次存储的A覆盖,当输出u.c是则会输出01000011对应的十进制67,输出u.i为0x143对应的十进制323.

拓展

值得注意的是当共用体中含有数组元素时,重复的赋值则不会被覆盖,应为不同的数组元素对应不同的地址,如下例所示。

union
{
    int i;
    char x[2];
} a;
int main()
{
    a.x[0] = 10;
    a.x[1] = 1;
    printf("%d\n", a.i);
    return 0;
}

10对应二进制:00001010
1对应二进制:00000001
存放方式:
【考研复习】union有关的输出问题_第3张图片
计算所得值: i = 2^8 + 2^3 + 2^1 = 256 + 8 + 2 = 266

参考文章

1
2

你可能感兴趣的:(考研复习,C/C++,c语言,考研,专业课840,开发语言)