打印

求助!关于在KEIL C 中定义位域联合体

[复制链接]
11399|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hua00001|  楼主 | 2010-7-20 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
union {
      struct {
         unsigned b0:1;
         unsigned b1:1;
         unsigned b2:1;
         unsigned b3:1;
         unsigned b4:1;
         unsigned b5:1;
         unsigned b6:1;
         unsigned b7:1;
         }oneBit;
        unsigned char allBits;
       } myFlag;
#define fast    myFlag.oneBit.b0
#define mid     myFlag.oneBit.b1
#define slow    myFlag.oneBit.b2
#define flow    myFlag.oneBit.b3
#define voice   myFlag.oneBit.b4
#define pause   myFlag.oneBit.b5
#define white   myFlag.oneBit.b6
#define on_off  myFlag.oneBit.b7
#define mark    myFlag.allBits
上面的语句在PICC中编译出来每一个占一个位,但在KEIL C中编译出来怎么占一个字节啊?如果在在KEIL C 中要实现如上功能,应该怎么写呢?

相关帖子

沙发
ayb_ice| | 2010-7-20 09:59 | 只看该作者
KEIL C直接支持位定义功能,不用这么麻烦
单个位定义
bit flag;
bit b;
if(flag)....
b = flag;
组合方式
char bdata my_flag;
sbit flag0 = my_flag^0;
sbit flag1 = my_flag^1;
sbit flag2 = my_flag^2;
...

my_flag = 3;
if(flag0){
...
}

使用特权

评论回复
板凳
hua00001|  楼主 | 2010-7-20 10:22 | 只看该作者
可以了,谢谢!

使用特权

评论回复
地板
xlsbz| | 2010-7-20 10:37 | 只看该作者
最不喜欢用 联合体了 因为不会用 但是从可移植性考虑 1楼的做法 比 2楼的 强百倍

使用特权

评论回复
5
mohanwei| | 2010-7-20 11:03 | 只看该作者
这个不能怪Keil,是C标准规定了位域是2字节对齐的……也就是说就算你只定义了1bit的位域,它也要占用2字节,其它的15bit就这么空着……不信试一下以下代码:
typedef struct
{
        unsigned b0:1;
        unsigned b1:1;
        unsigned b2:1;
        unsigned b3:1;
        unsigned b4:1;
        unsigned b5:1;
        unsigned b6:1;
        unsigned b7:1;
}oneBitStructs;
typedef union
{
        oneBitStructs oneBit;
//        unsigned char allBits;
}myFlag;

myFlag flag;
void main(void)
{
        int size = sizeof(myFlag);
        size = sizeof(oneBitStructs);
        while(1)
                ;
}
优化级别设为0
单步调试过程可以看到myFlag这个联合体占用了2字节,结构体oneBitStructs也是一样

使用特权

评论回复
6
mohanwei| | 2010-7-20 11:08 | 只看该作者
位域能不用就最好不要用,否则移植、通信会带来很多麻烦……因为位域的对齐、大小端在不同编译器里往往都不一样……

而且看上去省了资源,实际上不是那么回事,尤其是在不支持bit的体系上……

使用特权

评论回复
7
xurenhui| | 2015-3-22 23:00 | 只看该作者
谢谢,

使用特权

评论回复
8
lomo1316| | 2018-10-12 13:44 | 只看该作者
试一下改成

union {
      struct {
         unsigned char b0:1;
         unsigned char b1:1;
         unsigned char b2:1;
         unsigned char b3:1;
         unsigned char b4:1;
         unsigned char b5:1;
         unsigned char b6:1;
         unsigned char b7:1;
         }oneBit;
        unsigned char allBits;
   } myFlag;
可能能用,我的好像这样就可以了

使用特权

评论回复
9
linqing171| | 2018-10-14 22:10 | 只看该作者
unsigned i; 按照c标准是unsigned int i;
在keil c51中,int占两个字节;而在PICC中就不是了。比如ccs info公司的picc中longlong才是两个字节,long才是一个字节。而其他家的picc更是怪异的很。不用picc多年了,但是对于各家的int的长度,不敢苟同。还有只占一个bit的。

使用特权

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

本版积分规则

44

主题

151

帖子

3

粉丝