免费注册 查看新帖 |

Chinaunix

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

[C] 大小端问题求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-08 23:32 |只看该作者 |倒序浏览
代码如下:
unsigned char puc[4];
struct tag
{
        unsigned char ucP;
        unsigned char ucD0:1;
        unsigned char ucD1:2;
        unsigned char ucD2:3;
}*pst;

假设结构体以四字节对齐方式对齐,可知该结构体tag占用2个字节,其中成员ucD0、ucD1和ucD2一起占用一个字节,那么在大小端情况下,这三个成员在8位序列(一个字节)里的储存情况是怎么样的呢,比如小端情况下,成员变量ucD0占用一个字节中的第一个位呢还是占用这个字节的第八位呢,请高人指点,谢谢。

论坛徽章:
0
2 [报告]
发表于 2009-10-08 23:44 |只看该作者
你这个不论是大端还是小端
ucD0都是占用一个字节中的第一个bit位!!!

大小端是对字节而言的,不是bit

论坛徽章:
0
3 [报告]
发表于 2009-10-08 23:45 |只看该作者
单字节不受影响吧???

大端小端存储好像只对字、双字之类的会产生影响

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
4 [报告]
发表于 2009-10-08 23:56 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2009-10-09 00:00 |只看该作者

回复 #1 skyguide 的帖子

拜托,字节序和比特序是两码事。

论坛徽章:
0
6 [报告]
发表于 2009-10-09 22:44 |只看该作者
原帖由 ubuntuer 于 2009-10-8 23:44 发表
你这个不论是大端还是小端
ucD0都是占用一个字节中的第一个bit位!!!

大小端是对字节而言的,不是bit


那下面这个程序输出什么呢

unsigned char puc[4];
struct tag
{
        unsigned char ucP;
        unsigned char ucD0:1;
        unsigned char ucD1:2;
        unsigned char ucD2:3;
}*pst;



int main()
{
        pst=(struct tag*)puc;
        memset(puc,0,4);
        pst->ucP=1;
        pst->ucD0=2;
        pst->ucD1=3;
        pst->ucD2=4;
        printf("%02x,%02x,%02x,%02x\n",puc[0],puc[1],puc[2],puc[3]);
        return 0;
}

puc[0]很好理解,就是01,puc[2]和puc[3]是00、00。ucD0、ucD1、ucD2占用一个字节,按说,ucD0占用第一位(0),ucD1占用第二三位(11),ucD2占用第四五六位(100),那么puc[1]应该是01110000,请问,可是这样?运行结果好像是00100110

论坛徽章:
0
7 [报告]
发表于 2009-10-11 20:37 |只看该作者
原帖由 skyguide 于 2009-10-9 22:44 发表


那下面这个程序输出什么呢

unsigned char puc[4];
struct tag
{
        unsigned char ucP;
        unsigned char ucD0:1;
        unsigned char ucD1:2;
        unsigned char ucD2:3;
}*pst;



int main()
{
        ps ...



高人指点一下pu[1]为什么那样输出啊

论坛徽章:
0
8 [报告]
发表于 2009-10-11 21:10 |只看该作者
原帖由 ubuntuer 于 2009-10-8 23:44 发表
你这个不论是大端还是小端
ucD0都是占用一个字节中的第一个bit位!!!

大小端是对字节而言的,不是bit

正解 Endian基本针对字节.......

论坛徽章:
0
9 [报告]
发表于 2009-10-11 21:43 |只看该作者
特意看了下wiki活用到这个程度了 。。。
http://en.wikipedia.org/wiki/Bit_numbering

论坛徽章:
0
10 [报告]
发表于 2009-10-11 21:56 |只看该作者
原帖由 skyguide 于 2009-10-9 22:44 发表


那下面这个程序输出什么呢

unsigned char puc[4];
struct tag
{
        unsigned char ucP;
        unsigned char ucD0:1;
        unsigned char ucD1:2;
        unsigned char ucD2:3;
}*pst;



int main()
{
        pst=(struct tag*)puc;
        memset(puc,0,4);
        pst->ucP=1;
        pst->ucD0=2; // ucD0就一位, 即只能赋值0或1,你赋值2编译器应该报错的吧~~
        pst->ucD1=3; // 3 == 11
        pst->ucD2=4; // 4 == 100
        printf("%02x,%02x,%02x,%02x\n",puc[0],puc[1],puc[2],puc[3]);
        return 0;
}


假如

        pst->ucD0=1; // 1
        pst->ucD1=3; //11
        pst->ucD2=4; //100


依次把各位填充,第2个字节:[b7][b6][b5][b4][b3][b2][b1][b0]
ucD0填充b0, ucD1填充b1,b2,ucD2填充b3,b4,b5   --> [0][0] [1][0][0][1][1][1]
那该字节即 00100111对应的%02x就是27
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP