分享

读《C语言深度解剖》笔记:大端与小端

 重拾昔日外文 2012-04-01
摘要: 谁说国内没有NB的人、NB的好书!《C语言深度解剖》的第三行就写道"以含金量勇敢挑战国内外同类书籍"!!内容是在作者讲union的时候说的,当时我真的不太理解,只知道是两种存储模式,概念如下大端模式:字数 ...

谁说国内没有NB的人、NB的好书C语言深度解剖》的第三行就写道"以含金量勇敢挑战国内外同类书籍"!!

内容是在作者讲union的时候说的,当时我真的不太理解,只知道是两种存储模式,概念如下

大端模式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端模式:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

还知道有个方法选择系统是哪种存储模式及两个图:

/* 0大端,1小端 */
int checkSystem()
{
union check
{
int i;
char ch;
}c;
c.i=1;
return (c.ch==1);
}

 

然后我一直往下看,遇到这样一个题:在x86系统下,其值为多少?

int main()
{
int a[4]={1,2,3,4};
int *ptr1=(int*)(&a+1);
int *ptr2=(int*)((int)a+1);

print ("%x,%x",prt1[-1],*ptr2);

return 0;
}

先说ptr1,我知道 &a是整个数组的首地址,所以&a+1指到了整个数组后面

因为(&a+1)这个地址转换成(int*),所以(a&+1)指向了整个数组后一个int型的整数。prt1[-1]就是 *(prt1-1),也就是a[3],所以是4,这个自己做出来了!

再看ptr2,首先我知道a表示数组首元素的首地址,(int)a+1就是把地址a转换int型加1,因为int类型是4个字节存储,(int)a+1就指向a[0]的第二个字节的指针了。转换成(int*)的ptr2就像上图表示的一样指向一个int类型, 这些我也想到了,可ptr2指向的值是多少呢?这里,就关系到存储模式的问题!

根据我的理解我可以知道a[0]为【0x00 0x00 0x00 0x01】,a[1]为 0x00 0x00 0x00 0x02,这样,可我不知道这是什么端的存储,这两天要放假也不想看,本来说放弃的,可想想以这种心态怎么可以呢?!!不是当年的我啊~,而且是一点小小的问题,不能这么看不起自己,于是就翻到前面详细看看,再解理一下,原来,静下心来问题是多么简单明了!下面是我在编辑器里做的简明示意,而且超级好记:

 这样是不是很清楚呢!小端相前,大端相后。(注:有的系统是两个模式都有的。)

*ptr2的值也揭晓了,大端0x100,小端0x2000000。

 

so,学习需心静

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多