位段操作问题

 

struct A 

{

unsigned char a:4;

unsigned char b:2;

unsigned char c:2;

};

char ch = 0x45; //0100,0101

struct A *aa = (struct A*)&ch;

《C程序设计》-谭浩强 P306 图12.6所示原理,struct A 的内存分布如下:
0100 | 01 | 01 //位序:7~0
a       | b   | c
那么
aa->a = 4;
aa->b = 1;
aa->c = 1;
实际上,这是个错误的结果(xp+vc6.0),
aa->a = 5;
aa->b = 0;
aa->c = 1;
这是为什么呢?主要是书上图12.6不够清晰,没有标明位(bit)序,容易造成误解,我们知道,结构体中
a,b,c的排列顺序是:a--b--c,位序从低到高,那么,实际上,a,b,c在内存中的位置应该是:
01 | 00 | 0101 //位序:7~0
c   |  b   | a
如果非要转成如书中图12.6那样,那么:
1010 | 00 | 10 //位序:0~7
a       | b   |  c
这样虽然可以,但是不符合我们常规的阅读习惯,而且取值的时候还可以出错,因为字节的位序倒过来了,取值的时候也要倒过来看,
得不偿失,还不如:
01 | 00 | 0101 //位序:7~0
c   |  b   | a
这样清晰明了。取值也不会出错。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值