免费注册 查看新帖 |

Chinaunix

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

问关于位域的最后的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-22 11:06 |只看该作者 |倒序浏览
大家好,关于位域,仍旧有些地方不是很清楚,希望大家能够解答一下。



    上图中为 WIKI 上面关于 "Bit Field" 的论述,其中说到 "Bit Field" 的两个缺点:
    (1) the ordering of bits in memory is cpu dependent     (这个应该是 ‘大小端’        的问题)
    (2) memory padding rules can vary between compilers (这个应该是 ‘填充不填充’  的问题)

    根据我个人的理解:
    对于 (2),我感觉应该和移植性没有什么关系吧。不同的结果也就是:两个不同的平台,定义相同的 structure 所占据的字节数不一样而已,对程序
                  的正确性应该没有什么影响吧?
【问题1】

    对于 (1),我感觉应该和移植性也没有什么关系吧,int 类型占据四个字节,大端的平台和小端的平台也不一样啊,干嘛非得在 Bit Field 这个地方突出说明呢?【问题2】

    还有一个需要确认的问题:
    ----------------------------
    例如:
           typedef struct bit_field
           {
               unsigned char  a : 8 ;
               unsigned char  b : 8 ;

           } bit_field_t ;

           上面的 bit field 占据 2 个字节,有两个成员(a 和 b)

          假设
                unsigned short = 0x1234 ;
                bit_field_t    bf ;
                memcpy( &bf, &tmp, sizeof(unsigned short) ) ;
                printf(" a = %d\n", bf.a) ;
                printf(" b = %d\n", bf.b) ;

          那在不同的平台上,上面的输出会有不同吗?【问题3】

painter.jpg (311.01 KB, 下载次数: 9)

painter.jpg

论坛徽章:
0
2 [报告]
发表于 2010-07-22 11:33 |只看该作者
说说我的理解:

(1)(2),移植性没啥问题吧,主要是考虑不同平台间数据通信时的情况~

(3)大小端不同的话,输出结果也是不同的~

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2010-07-22 11:33 |只看该作者
【问题1】:如果在两个不同的平台使用位域定义来交换数据就有问题了
2:int可以直接htonl、ntohl之类的转换,都是标准的,可是位域填充规则不一致,没有统一标准

论坛徽章:
0
4 [报告]
发表于 2010-07-22 11:37 |只看该作者
谢谢楼上的回答。

关于 【问题3】,刚试验了一下。

的确会输出不同的结果。

论坛徽章:
0
5 [报告]
发表于 2010-07-22 11:44 |只看该作者
例如内存中某段数据由内存低到高如下排列 12 34 56 78,在LE的机器上此数字为78563412,在BE的机器上则为12345678,此为(1).
第二个问题3楼说的没错,不同平台,甚至同一个平台的不同编译器对位域的填充方式都不同,我记得windows下的microsoft c和 mingw对位域的处理方式是不同的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP