查看: 4043|回复: 10

[其他] 每天解决一个问题10:被忽略的C语言位段

[复制链接]
  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    连续签到: 1 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
    发表于 2015-9-5 23:54:15 | 显示全部楼层 |阅读模式
    本帖最后由 ALTIUM2 于 2015-9-5 23:54 编辑

    每天解决一个问题10:被忽略的C语言位段(位段也叫位域)

    说真的,什么是“位段”,想当初自己还真的不是很了解,因为压根就用不着,更何况如今FLASH都是上512KB的容量,估计很少很少有人用到,但有时候还是非常有用的。

    关键优势:
    在一些经济型产品设计中,多一点浪费,少一点又不能完成项目需求,所以“能省就省,花最少的钱办最多的事”。采用位段结构既能够节省空间,而且又方便于操作。

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

    应用举例:
    例如在有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。比如我们经常会有开关量的使用,而它只有0和1两种状态,用一位二进位即可。我们正常直接一个字符型搞定,但如果用位段,我们一个字符却能够存8个开关量,总大小只有一个字节,而如果用字符型就要8个字节,这种优势十分明显啊。

    如何定义:
    --------------------------------------------------
    struct 位域结构名
    { 位域列表 };

    其中位域列表的形式为:
    类型说明符位域名:位域长度
    --------------------------------------------------
    --------------------------------------------------
    例如:
    struct packed-data
    {
      unsigned    a:2;
      unsigned b:6;
      unsigned c:4;
      unsigned d:4;
      int i;
    }data;
    --------------------------------------------------

    存放方式:
    位段存放方式.jpg
    a是字符型,占两位,说明data为packed-data变量,共占两个字节。其中位段a占2位,位域b占6位,位域c和d占4位。

    终上所述,位段在本质上就是一种结构类型,其成员是按二进位分配的。

    使用须知:
        1)位段的类型只能是int,unsigned int,signed int三种类型,不能是char型或者浮点型;

        2)位段占的二进制位数不能超过该基本类型所能表示的最大位数,比如在VC中int是占4个字节,那么最多只能是32位;

        3)无名位段不能被访问,但是会占据空间;

        4)不能对位段进行取地址操作;

        5)若位段占的二进制位数为0,则这个位段必须是无名位段,下一个位段从下一个位段存储单元(这里的位段存储单元经测试在VC环境下是4个字节)开始存放;

        6)若位段出现在表达式中,则会自动进行整型升级,自动转换为int型或者unsigned int。

        7)对位段赋值时,最好不要超过位段所能表示的最大范围,否则可能会造成意想不到的结果。

        8)位段不能出现数组的形式。






    我知道答案 目前已有10人回答
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    连续签到: 1 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
     楼主| 发表于 2015-9-5 23:54:39 | 显示全部楼层
    这两天有事的,一定把前面的补上来
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-9-6 00:24:12 | 显示全部楼层
    这个很有用啊,没有被忽视吧!看官方库里面就有应用,只是程序员自己的应用没有用!
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19

    主题

    401

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1114
    最后登录
    2017-8-16
    发表于 2015-9-6 09:04:31 | 显示全部楼层
    感觉union才是被忽略的
    freescale.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    61

    主题

    965

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2394
    最后登录
    1970-1-1
    发表于 2015-9-6 09:25:13 | 显示全部楼层
    这个怎么会被忽略呢,现在还说用的很多
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2015-9-6 10:17:57 | 显示全部楼层
    这是最基本的东西。 blank.png blank1.png blank2.png blank3.png blank4.png blank5.png blank6.png blank7.png blank8.png blank9.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    连续签到: 1 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
     楼主| 发表于 2015-9-6 18:53:35 | 显示全部楼层
    干嚼是自己表达的确实有点问题,反正就是希望留意下了!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    连续签到: 1 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
     楼主| 发表于 2015-9-6 18:54:13 | 显示全部楼层
    anger0925 发表于 2015-9-6 09:25
    这个怎么会被忽略呢,现在还说用的很多

    嗯,自己表达的不是很好,谢谢
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    连续签到: 1 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
     楼主| 发表于 2015-9-6 18:55:26 | 显示全部楼层
    673402618 发表于 2015-9-6 09:04
    感觉union才是被忽略的

    哦,为啥子我个人觉得union和位段前者更容易被忽略,呵呵!
    谢谢
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    连续签到: 1 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
     楼主| 发表于 2015-9-6 18:56:10 | 显示全部楼层
    JackieLaura 发表于 2015-9-6 00:24
    这个很有用啊,没有被忽视吧!看官方库里面就有应用,只是程序员自己的应用没有用! ...

    ,其实我的意思就是这个,谢谢,自己表达的欠妥
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 23:34 , Processed in 0.162542 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表