- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
位段的用法
位段的用法
也许您对位段接触不多,但在实际的开发中如果熟练掌握了位段的使用方法,将会使你
的工作事半功倍,同时写出来的程序也会占用更少资源,这也就意味着您的程序将拥有更高
的运行效率。那么位段到底是什么样子的呢?下面就对它进行详细的讲解。
1、位段的定义
位段与结构体上形式与用法上是很相近的。但位段可以用来描述更为细腻的数
据级别。结构中可以包含各种不同的数据类型,甚至可以是另一种结构体类型,但
它所能表示的最小单位是一个字节,即8位。在给单片机编程时,很多情况下,描
述一个数值或一种状态并不需要这么多位,可能3个或4个位就已经足够了。比如,
要描述“成功”还是“失败”,只需要一个位就可以了。那么如果用1个字节的话
就会浪费7个位。再如在数据通信中,经常会有一个字节中的某些位表示某一含义,
典型的应用是某一位为“1”,表示此数据有效,反之无效。我们就需要一种在“位”
这种级别上的结构来描述它。这种“位”的结构就被定义为“位段”。
2、位段的应用实例
位段在处理位时是非常方便的。以下例来进行说明:
在给定的long型变量dat中,提取第13~15位,如下图所示:
如果我们采用移位方式来实现,可以这样来作:
unsignedcharget_bits(unsignedlongdat)//此函数采用移位方式实现
{
dat=0x0000e000;//屏蔽13~15位以外的位
return(unsignedchar)(dat13); //右移13位
}
而如果使用位段则可以这样来实现:
structbits
{
unsignedinta:16;
unsignedintb:13;
unsignedintc:3;
};
采用如下表达式就可将这三个全取出:
((structbits*)(dat))c;
如果dat=0即0b00000001001000110100010101100111,第13~
15位为(010)=2。
经验证以上程序的计算结果与之是吻合的:
从上面已经大致可以了解了位段的使用方法了。形如结构体,位长的定义用
unsigned或int来定义。如unsigneda:3或unsignedinta:3定义了定义a为位长为3
的位段成员。
3、位段的用法
1)定义位段时可以有标准数据类型,如下:
structbits
{
unsigneda:2;
unsignedb:3;
unisngedc:4;
inti;
};
这个位段定义中除了定义了各成员的位长以外,还有int型。
2)各位段不足一个字节时,后面的标准数据类型将从新的存储单元开始。
在上例中,其中a、b、c共占9位,占用了1个字节还要多,不到2个字
节。而它后面为int型,占用2个字节。则a、b、c之后的7个位的空间闲置不
用,i从另一个字节开头存放。如下图所示:
3)存储单元中位段的空间分配方向为由低位到高位分配。
上例中的字段分配图只是一个示意图,在内在的实际表示其实是这样的:
先定义的a(2个位),被分配到高16位的低位上,紧接着是b(3个位),
后面的成员分配依此类推。最后的int型,因为是16位,高16位剩余的7个
位不能容纳它,则i被分配到低16位。
4)给位段赋值时的自动截
原创力文档


文档评论(0)