在C语言中,`union`(联合体)和位域(bit-fields)都是用于在内存中对数据进行灵活组织的特性。 1.联合体(union): `union`是一种特殊的数据结构,允许在相同的内存位置存储不同的数据类型。`union`中的所有成员共享同一块内存空间。`union`的大小等于其最大成员的大小。这意味着`union`中只能存储其中一个成员的值...
typedef struct{unsigned int red : 1;unsigned int green : 1;unsigned int yellow : 1;} TrafficLight1; 三色红绿灯加起来一共需要3个bit,所以一个无符号整型就可以容纳这些值了,此时看一下这个结构体的长度,应该为4。 总结一下: 当结构体或共用体中有无符号整型或有符号整型成员时,C语言允许用户指定这些...
小端:低位数据字节存储在低地址 注释:例如int的权重低的8bit,低位指的是00000001 00000000000000000000000000000001 2、共用体union存储结构 共用体内每段数据元素从低地址开始存储。 注释:数组的每个元素的地址随着索引的增大而增大。 例如: union {charb[2];inta; } value; printf("pa: %p\n", &value.a); prin...
union:union { int a;char b;short c;}un;位域:struct bitDomain{ int a:10;char b:2;int c:22;} union:占用字节数最大的数据类型为union的字节宽度,如上un的占用4字节。位域:在内存对齐的基础上,各成员的宽度之和,如上bitDomain占用8字节。struct bitDomain{ int a:10;int b;in...
由于是8bit的图片,这个图片的head将是一个16bit的索引,也就是调色板(具体这些定义可以自行查找rgb以及bmp的资料),它将和具体的索引值一起存在以上g_color__table中。 处理调色板数据的时候直接用这个union.color_tab。 这体现了union的第一个作用:
读出来之后我们要通过数据手册给定的公式计算成实际温度(设想这个公式为 temp = reg_val *10)。我们怎么实现呢?要知道,i2c的数据传输是按照byte传送的,也就是说,你只能用char类型结束数据,说白了,每个时序你只能接收8个bit的数据。所以12个bit需要读两次,用两个char类型变量或一个char类型数据接收。
首先,extern union定义了一个联合。联合里面包含了一个8位整数STAT以及一个结构体。联合每次只能使用其中的一种类型,也就是说联合要么使用整数STAT,要么使用结构体,不能同时使用。使用整数,很简单,不用多言。其中的结构体,是一个位字段,里面包含8个bit,可以方便地为每个bit赋值。
union test { unsigned char ODR; struct { unsigned char bit0:1, bit1:1, bit2:1, bit3:1, bit4:1, bit5:1, bit6:1, bit7:1; }; }; union test c; 这里联合体有两个成员,一个char ODR,还有一个8位的结构体,因为内存共享,这么着操作后边的结构体就可以改变ODR 例如c.ODR = 0XFF,或者...
我们平时会遇到一些数字传感器,往往他转换完成后的数据需要2 个字节或者4 个字节来存储,比如陀螺仪的3 轴 加速度的三个寄存器都是16bit 的,但是我们通过IIC或者SPI读取的时候都是一个字节一个字节的读取的。这时候我们就可以使用联合体来进行数据的大包转换。
再比如一个 24 bit 表示的像素点,由 Red,Green,Blue 三种颜色组成(由这三种颜色可以组成任一种看到的颜色),每种颜色 8 bit,但是有时候他们又可以进行组合,组合一个代表像素点的值,这时就可以使用联合体。 这里就是一个联合体的声明(关于 typedef 关键字,看C语言之类型定义(typedef),关于 struct 关键字,看C...