打印

看TI的zigbee协议栈时的C语言问题

[复制链接]
15651|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ringsearch|  楼主 | 2011-10-23 13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看TI的zigbee协议栈时发现有个这样的定义:
typedef struct
{
  byte          EndPoint;
  uint16        AppProfId;
  uint16        AppDeviceId;
  byte          AppDevVer:4;
  byte          Reserved:4;            
  byte          AppNumInClusters;
  cId_t         *pAppInClusterList;
  byte          AppNumOutClusters;
  cId_t         *pAppOutClusterList;
} SimpleDescriptionFormat_t;
在这里面byte          AppDevVer:4;这个AppDevVer后面的“:”然后跟个4,是什么意思?这是什么用法?

相关帖子

沙发
一个机会| | 2011-10-24 00:16 | 只看该作者
不懂帮顶

使用特权

评论回复
板凳
lzw625| | 2011-10-24 10:31 | 只看该作者
是BYTE型,连续4个BYTE,

使用特权

评论回复
地板
ringsearch|  楼主 | 2011-10-24 11:53 | 只看该作者
难道是定义四个BYTE型变量,那它们的变量名都是 AppDevVer?如果我 SimpleDescriptionFormat_t.AppDevVer=0x11;行吗?
若是定义一个四个字节变量,那怎么会是byte型呢,byte型就是unsigned char,这可是单字节变量声明。

使用特权

评论回复
5
TI_MCU| | 2011-10-24 12:38 | 只看该作者
不是吧   :4指的是占4个bit

byte          AppDevVer:4;
byte          Reserved:4;      

这两个一起占用了一个byte

使用特权

评论回复
6
ringsearch|  楼主 | 2011-10-24 19:36 | 只看该作者
有点晕,那怎么赋值呢?这是C语言中的什么用法?而且怎么知道占用的是BYTE的高四位还是第四位呢?按顺序吗?

使用特权

评论回复
7
478189902| | 2011-10-24 21:38 | 只看该作者
不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶不懂帮顶

使用特权

评论回复
8
sjl2006| | 2011-10-25 16:44 | 只看该作者
5# TI_MCU
TI_MCU正解。这个是C语言的位域,请到谭浩强的书里找。

使用特权

评论回复
9
ringsearch|  楼主 | 2011-10-25 19:54 | 只看该作者
嗯,找到了,呵呵,过去没注意看书的最后两章,这里也简单说说位域这个概念,让遗漏这个概念的人都知道下。
内存中信息的存取一般是以字节为单位,但有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。为了节省存储空间,并使处理简便,位域就是为这个而设计的。
所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
C语言中允许在一个结构体中以位为单位来指定其成员所占的内存长度,这种以位位单位的成员称为“位段”或“位域”。位域的定义形式为: 类型说明符 位域名:位域长度。
如上面的
byte          AppDevVer:4;
byte          Reserved:4;
当需要引用或赋值时,就像结构体内变量的使用一样,如:SimpleDescriptionFormat_t.AppDevVer=1
需要注意的是:
1、在赋值时注意位于允许的最大范围,就是它占多少个位,像AppDevVer:4,AppDevVer占用4个位,其最大值不能超过15,若超过了则自动赋予它数的低位,如:SimpleDescriptionFormat_t.AppDevVer=16,16的二进制数为10000B,那么SimpleDescriptionFormat_t.AppDevVer取第四位,故SimpleDescriptionFormat_t.AppDevVer=0
2、一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,则从下一单元起存放该位域。
3、可以定义无名位域,这时它只用来作填充或调整位置。
如:
byte          AppDevVer:4;
byte          :4;
则AppDevVer之后是无名位段,该空间不用。
另外还需要注意的是位域的长度不能大于存储单元的长度,也不能定义位域数组。
以上对平时应用应该差不多了,如果需要更多了解可以看《C程序设计》第十二章。

使用特权

评论回复
10
快乐出发| | 2011-10-25 20:46 | 只看该作者
又要买书了。

使用特权

评论回复
11
lilihua0721| | 2011-10-25 23:15 | 只看该作者
byte          AppDevVer:4;  表示占用4个位
byte          Reserved:4;     表示占用4个位
这两个一起占用了一个byte

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

36

帖子

1

粉丝