C语言中位段题目的练习与解析

1.什么是位段?

     位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或被称为"位域"。利用位段能够用较少的位数存储数据。

2.优点、缺点、缺陷与不足:

    优点:(1).可以使数据单元节省存储空间。

             (2).方便访问一个整数内容部分内容从而简化程序源代码。

    缺点:其内存分配与内存对齐的实现方式依赖于具体的机器和系统,在不同的平台可能有不同的结果,这导致了位段在本质上是不可以移植的。

    缺陷与不足: 

         (1).int 位段被当成有符号数还是无符号数是不确定的。

         (2).位段中最大数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器上会有问题)

         (3).位段中的成员在内存中是从左向右分配,还是从右向左分配的标准尚未定义。

         (4).当一个结构体包含两个位段,第二个位段成员比较大时,无法容纳于第一个位段剩余的位,剩余的位是舍弃还是利用时,还是不确定的。

 3.类型:

     位段成员类型必须指定为整形类型。整形家族【unsigned int , signed int ,char 】 。   

4.  位段的使用方法:

        变量类型+变量名+:  +分配的比特位

5.注意:

        1.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。

        2.位段成员们类型一般是整形类型的,很少在同一个结构体中很少出现不同的成员类型,比如(float、double,long)

6.例子:

#include <stdio.h>
struct S
{
    char a:3;
    char b:4;
    char c:5;
    char d:4;

};
int main()
{
    struct S s={0};
    s.a=10;
    s.b=12;
    s.c=3;
    s.d=4;
    printf("%d\n",sizeof(struct S));
    return 0;

}

1.根据注意中的第一条规则:  位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。我们看以下的结构体:

在visual stdio 2019平台上,那么结构体sturct S的大小是不是3个字节呢? 

那么,在visual studio 2019平台上,上述开辟一个1字节空间,容纳第一个成员a,剩余的比特位容纳不得下一个成员时,剩余的比特位是被弃用的,则需要重新开辟一个1字节空间。

 2.结构体Struct s开辟了三个字节空间那么他们是怎样存储数据的呢?

   假定它们是从右向左分配的。  

接下来进行存储数据:

内存上是:

那么结构体struct S 的变量s,它的内存分配是不是 620304呢?

从上图可知, 证明在visual studio 2019的平台上,位段成员在内存上是从右向左分配的。

在我们看来,结构体和位段 相似,能够节省空间,但是位段存在缺陷和不足,可以返回上文看看位段的缺陷和不足的介绍吧。


位段的练习题目:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
    unsigned char puc[4];
    struct tagPIM
    {
        unsigned char ucPim1;
        unsigned char ucData0 : 1;
        unsigned char ucData1 : 2;
        unsigned char ucData2 : 3;
    }*pstPimData;
    pstPimData = (struct tagPIM*)puc;
    memset(puc, 0, 4);
    pstPimData->ucPim1 = 2;
    pstPimData->ucData0 = 3;
    pstPimData->ucData1 = 4;
    pstPimData->ucData2 = 5;
    printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
    return 0;
}

题目解析: 

   那么打印的值为puc[0]=02,puc[1]=29;puc[2]=00;puc[3]=00;

揭晓答案:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值