c++的 union类型平时用的真心少 从来没有认真研究过他
今天看了几道c++的笔试题 有几道 关于union的 题目 现在总结下
第一题:
union V {
struct X {
unsigned char s1:2;
unsigned char s2:3;
unsigned char s3:3;
} x;
unsigned char c;
} v;
v.c = 100;
printf("%d", v.x.s3);
答案为 3 (s2 为 1 , s1为0)
网上的解释
v是联合体(共用体)变量,共有两个元素x和c,都需要一个字节,它们分配于同一个地址。
而x是结构体变量,共有三个元素s1、s2、s3,分别占2位、3位、3位。分配内存时低位在前,最位在后。
当有v.c=100(其二进制为01100100)时,各变量的关系及内存存储情况见图所示。
其中x的成员s3为二进制的011,即十进制的3,所以输出结果为3。
同理的第二题:
#i nclude <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
int 为 .. ... 0000 0001 0000 0010
答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)
学习中 看了些文章 有所收获 下面转两篇文章
一篇是 union和struct的 大小问题
1,对于union,对齐的大小是最大的基本元素的对齐大小;对象的大小必须是该基本元素大小的整数倍;
2,对于struct,对齐的大小也是最大的基本元素的对齐大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍;同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。
3,这里所说的struct和union的对齐,是指其作为其他复杂对象中的元素的时候要求的对齐,对于本身大小的计算并没有关系。本身的大小只和其所包含的基本元素的对齐有关系。
(copy 一段网上的对齐规则 1,数据成员对齐规则:结构的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储) 2,,结构体作为成员:如果一个结构体里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(struct a里存有 stuct b, b里有char,int,double等元素,那么b应该从8的整数倍开始存储) 3,收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。)
例子一:
union U1
{
char a[9]; //对齐大小是1,大小是9个字节
int b; //对齐大小是4,大小是4个字节
};
所以该union的对齐大小是4个字节;大小为大于等于max(9,4)=9并为4的整数倍,所以是12字节。
例子二:
union U1_Another