自定义类型练习题

1.联合体大小

#include 
union Un
{
	short s[7];
	int n;
};
int main()
{
  printf("%d\n", sizeof(union Un));//16
  return 0;
}

7*short==14字节,对齐16字节。
n4字节,n与s共用空间,取最长元素,占用16字节。

2.联合体赋值

#include
int main()
{
  union
  {
    short k;
    char i[2];
  }*s, a;
  s = &a;
  s->i[0] = 0x39;
  s->i[1] = 0x38;
  printf("%x\n", a.k);//3839
  return 0;
}

union占用2字节,
16bit,4个16进制位
_ _ _ _3839
i[1] i[0]

3.枚举类型

enum ENUM_A
{
  X1,
  Y1,
  Z1 = 255,
  A1,
  B1,
};
enum ENUM_A enumA = Y1;
enum ENUM_A enumB = B1;
printf("%d %d\n", enumA, enumB);//1 257

枚举默认从0开始,X1是0,Y1是1,
设定数字后根据数字后推,Z1是255,A1是256,B1是257

4.位段类型

typedef unsigned char u_c;
int main()
{
	u_c a[4];
	struct tag
	{
		u_c A;
		u_c x : 1;
		u_c y : 2;
		u_c z : 3;
	}*p;
	p = (struct tag*)a;//字符数组a被结构体填充
	memset(a, 0, 4);
	p->A = 2;//10
	p->x = 3;//x只能存1位--0011截断1
	p->y = 4;//y只能存2位--0100截断00
	p->z = 5;//z只能存3位--0101截断101
	printf("%02x %02x %02x %02x\n", a[0], a[1], a[2], a[3]);
	//                               A    zyx
	//                               2  0010 1001
	//                           0x  02    29    00     00
	return 0;
}

你可能感兴趣的:(C语言经典题目,c语言)