共用体
产生以及意义
大小是共用体中占有字节数最大的字节数。共同体同一时间只能存在一个。
类型描述
union 共用体名
{
数据类型 成员名1;
数据类型 成员名2;
。。。
};
嵌套定义
cpp
#include <stdlib.h>
#include <stdio.h>
struct MM
{
int i;
char ch;
union // MU 不写名称为匿名结构体
{
int a;
char c;
}un;
float f;
};
union UU
{
int a;
double b;
struct
{
int arr[10];
float f;
};
};
int main()
{
struct MM m;
printf("sizeof = %ld \n",sizeof(m));
exit(0);
}
定义变量,初始化与引用
cpp
#include <stdlib.h>
#include <stdio.h>
union My
{
int i;
float f;
double d;
char c;
}m1;
int main()
{
union My m;
union My* p;
p->f = 3.14;
m.i= 10;
printf("sizeof(m) = %ld \n",sizeof(m) );
printf("m.f = %f \n",m.f);
printf("m.i = %d \n",m.i);
exit(0);
}
占用内存大小
占用共用体中,最大的那个元素的大小
cpp
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
/*
求一个无符号数的高16位加低16位
*/
union
{
struct
{
uint16_t i;
uint16_t j;
}x;
uint32_t y;
}a;
int main()
{
unsigned int i = 0x11223344;
//方式一:位运算
unsigned int sum = (i>> 16) + (i & 0xFFFF);
printf("sum = %u \n",sum);
printf("sum = 0x%x \n",sum);
//方式二:共用体
a.y = 0x11223344;
printf("sum = 0x%x \n",(a.x.i +a.x.j));
exit(0);
}
位域
没有实际的开发意义,但是面试过程中可能会考到
1字节占8位,用位域可以减少空间,但是不好移植,因为不同平台直接会有大小端的数据存储差异。语法 如下: 用冒号进行分开。
计算机存储数据的存储特点:正数直接存储,负数:绝对值 取反 在加1,逆推的话就是 减一 取反在加负号。
struct m
{
char a:1;
char b:2;
};
枚举
在别的语言中,枚举可能是基本类型或者构造类型,根据各自语言的定义。
enum的siof为
nuem 标识符
{
a,
b,
c
}
a从0开始存,一直向上增加,从int,增加到long long类型,超出会报错
enum.c:8:5: error: overflow in enumeration values(
enum.c:8:5:错误:枚举值溢出
)