C语言结构体位域和联合体的奇妙组合

结构体上一篇说过了  直接联合体开始

联合体(Union)是一种特殊的数据类型,它允许在相同的内存空间中存储不同的数据类型。在联合体中,所有的成员变量共享同一块内存空间,只能同时存储一个成员的值。

联合体的定义格式如下: 格式与结构体无异

union unionName {
   dataType member1;
   dataType member2;
   ...
};

在联合体中,每个成员变量可以是不同的数据类型,但是只能同时使用一个成员变量来存储数据。当一次给联合体赋值时,之前存储在联合体中的数据会被新的数据覆盖。

总字节(Total Bytes)是指一个数据结构所占内存的总大小。在计算总字节时,通常需要考虑数据的对齐和内存对齐的规则。

在C语言中,数据的对齐是指数据在内存中的存储对齐方式。根据不同的数据类型,可能有不同的对齐方式。例如,int类型的对齐方式通常是4字节对齐,double类型的对齐方式通常是8字节对齐。

内存对齐的规则是为了提高数据的读写速度和存储空间利用率。在计算总字节时,需要根据数据的对齐和内存对齐的规则来确定每个成员变量在内存中的存储位置。

计算联合体的总字节时,可以根据成员变量的最大字节大小来确定。如果联合体中的成员变量有不同的数据类型,那么总字节大小应该是最大的成员变量的字节大小。

下面是一个计算联合体总字节的例子:

union unionName {
   int num;
   char ch;
   double d;
};

int main() {
   union unionName u;
   printf("%zu", sizeof(u));  // 输出8字节
   return 0;
}

在上面的例子中,联合体unionName中最大的成员变量是double类型的d,占据8个字节。因此,联合体的总字节为8字节。

需要注意的是,由于联合体中的成员变量共享同一块内存空间,所以对一个成员变量的操作可能会影响到其他成员变量的值。因此,在使用联合体时需要谨慎操作。

计算字节的方式大有不同

联合体是以其内最大的字节作为基字节对齐  

例如上面那个代码一样 直接拿最大的字节来当总字节 但是 当最大字节也装不下的时候就会不同

union unionName {
   int num;
   char ch[20];
   double d[2];
};    //此时内存对齐将是24

为什么呢 因为系统会判断 当三个将是double的时候就会存不下 要保证能存都得下 最大字节序号就为24 

欢迎指正:

讲一下骚气的用法

  1 #include <stdio.h>
  2 union  poni{
  3 int a;     //内存向4字节对齐
  4 struct  {  
  5 
  6 int b:5;      //位域 限制int的范围 只能在 00000-11111 这个范围之间的数
  7 short c:1;    //限制范围只能是0 和 1
  8 int   u:2;    //限制范围 只能是 01 10  11 这三个数
  9 int   q:1;     //限制范围 只能是0 和 1
 10 int   ccc:22;  //限制范围的同时也占位
 11 int   cc:1;    //限制范围 只能是0 和 1
 12 }stuent;
 13 
 14 
 15 }pont;
 16 int main(int argc, char *argv[]){
 17     union poni  un;
 18     un.a=0x0;
 19     un.stuent.c=1;   //让第6位等于1
 20     un.stuent.q=1;  //让第9位等于1
 21     un.stuent.cc=1;//让第32位等于1
 22     printf("%#x\n",un.a);
 23     printf("%d\n",sizeof(un));
 24 
 25     return 0;
 26 } 
~                                                                                                                     
~                                                                                                                                  
~                                                                                                                     
~                                                                                                                     
~                                                                                                                     
~                                                                                                                     
~                 

可以通过联合体位域结构体来代替 & | ^的使用 我个人感觉 使用  &|^  << >> 来得到一个位的值有点麻烦 联合体位域结构体方便思路也清晰

不足的地方欢迎补充评论  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头真的要秃啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值