免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6294 | 回复: 3
打印 上一主题 下一主题

[C] 结构体位字段用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-16 22:48 |只看该作者 |倒序浏览
1.结构体一:
typedef struct
{
    unsigned x_bit : 3;
    unsigned y_bit : 3;
    unsigned z_bit : 2;
    char w[3];
} SAM_BIT;

定义:  
           SAM_BIT sam_bit;
初始化:
           sam_bit.x_bit = 7;
           sam_bit.y_bit = 5;
           sam_bit.z_bit = 3;
           memset(sam_bit.w, 0x0, 3);
查看内存:
           &sam_bit : 0x F7 00 00 00; 0xF7(111 101 11)
           &sam_bit : 0x EF 00 00 00; 0xEF(11 101 111)
当然这是不同的系统造成了不同的值,即不同的系统中位字段的存储方式不同。
前一种一般是Motorla机器上的存储结果,从左向右存储,称之为高位存储;
後一种是Intel机器上的存储结果,从右向左存储,称之为低位存储。
由此说来,位字段不具有可移植性。
为使其具有可移植性,应该使用位运算,而避免定义位字段的结构体。

2.结构体二:
typedef struct
{
    unsigned x_bit : 9;
    unsigned y_bit : 20;
    unsigned z_bit : 3;
} SAM_BIT;
定义:  
           SAM_BIT sam_bit;
初始化:
           sam_bit.x_bit = 0x1AA;
           sam_bit.y_bit = 0xEEEEE;
           sam_bit.z_bit = 0x7;
若是Intel机器,查看内存:
           &sam_bit : 0x AA DD DD FD;
为什么会是此值,我的理解是:
首先遵循小端字节序的原则,将x_bit中的0xAA存于第一个字节,然后由y_bit的低7位与x_bit的高1位构成第二个字节0x 1101110 1,由此第3字节为0x11011101,第4字节为0x 111 11101.
只是自己的推测,望达人指点。

在此主要是想说一下位字段的存储方式,与大伙探讨下,位运算想必大伙都明白,故不做说明了
最后还是那句话,尽量用位运算代替位字段,使其具有可移植性。

论坛徽章:
0
2 [报告]
发表于 2008-07-16 23:46 |只看该作者
这里的“可移植性”看怎么理解了,大端小端的问题很常见
另外,使用位段也不一定需要关心它们的具体存储方式(这本来是实现相关的)

论坛徽章:
0
3 [报告]
发表于 2008-07-17 19:45 |只看该作者
原帖由 tyc611 于 2008-7-16 23:46 发表
这里的“可移植性”看怎么理解了,大端小端的问题很常见
     能不能说说你的理解?学习下
另外,使用位段也不一定需要关心它们的具体存储方式(这本来是实现相关的)

     我想问下位段一般在用在什么情况下

论坛徽章:
0
4 [报告]
发表于 2014-10-13 14:58 |只看该作者
1、小端模式位段成员从低位开始,大端模式位段成员从高位开始
2、小端模式低地址存放低位字节,高地址存放高位字节,即存放顺序与逻辑顺序相反;
大端模式低地址存放高位字节,高地址存放低位字节,即存放顺序与逻辑顺序相同;


楼主第二题分析如下:

小端模式下:
位段:
z_bit        y_bit                        x_bit
111         11101110111011101110         110101010
组合起来就是:
11111101 11011101 11011101 10101010
小端存放形式:
低地址                                                高地址
第1个字节        第2个字节        第3个字节        第4个字节
10101010        11011101        11011101        11111101
AA                 DD                 DD                 FD

大端模式下:
位段:
x_bit                y_bit                        z_bit
110101010         11101110111011101110         111
组合起来就是:
11010101 01110111 01110111 01110111
大端存放形式:
低地址                                                高地址
第1个字节        第2个字节        第3个字节        第4个字节
11010101        01110111        01110111        01110111
D5                 77                 77                 77
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP