C语言union
及位域
1.union
union就相当于一个类型不固定的变量,存储大小由union内最长的变量决定,存储空间共享,访问内部不同的变量,就会以相应的变量规范对内存进行解析,以如下union为例
typedef union{
uint32_t v1;
int32_t v2;
} uni;
uni总长度32位,令uni.v2 = -1,此时uni就是32个1组成的变量,此时v1 = \(2^{32}-1\),如果添加了其他类型变量,比如float,那就会用float的规范解析32个1
2.位域
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言提供了位域.位域按照从低位到高位的顺序进行解析。
typedef union {
struct { uint8_t rs : 2, rt : 2, op : 4; } rtype;
struct { uint8_t addr : 4 , op : 4; } mtype;
uint8_t inst;
} inst_t;
inst_t.inst = 0b11100110;
因为union内所有变量共享内存,因此不仅inst被复制,其他两个变量也被赋值,此时inst_t.rtype.rs = 10,rt = 01,op = 1110