Linux Driver回忆录

专注Linux/Driver/NetWork

也谈大端模式(big endian)和小端模式(little endian) (一) 引 子

    以32位机来讲,比如有这样一个整形数0x11223344,假设从内存0x0地址开始存放这个数。

    对于大端模式(Big endian),低地址存放高字节。所以0x11223344在内存中的存放如下:

    0x00:0x11

    0x01:0x22

    0x02:0x33

    0x03:0x44

    而对于小端模式(Little endian),低地址存放低字节。所以0x11223344在内存中的存放和大端是相反的:

    0x00:0x44

    0x01:0x33

    0x02:0x22

    0x03:0x11

    相信大家对这个知识点都比较熟悉,不过稍微想想,马上又会觉得干嘛要弄两种不同顺序的存放方式呢?(遵循不讲故事只讲事实的原则,这里不再赘述其来由) 

    容易想到的问题是:存放方式不同,读取出来的时候会不会出错呢?读取一个字节得到的值是什么?读取两个字节呢?读取四个字节呢?

    首先,变量的地址都是变量存放的低地址,不论大端还是小端,如果有int ByteOrder= 0x11223344,我们假设变量ByteOrder在内存中的地址为0x00,那么不论读取一个字节还是四个字节,都会从内存的0x00地址处开始读取。

    大端模式:一次读取四个字节,很显然我们取回来的是数应该是0x11223344。取两个字节(我们可以这样写代码:short b = (*(short *)&ByteOrder),再打印b的值就成了):0x1122。取一个字节:0x11。

    小端模式:同样一次读取四个字节,我们得到的肯定也是0x11223344。而读取两字节:0x3344。取一个字节:0x44。

    所以现在摆在我们面前的主要有两个问题:

    1. 取一个/两个字节的时候,大小端取出来的值不同,但是当按四个字节取出来的时候,又相同了,这是为什么呢?

    2.上面是用指针的方式取值的,如果改成强制转换,比如short b = (short)ByteOrder,值又是什么呢? 

   

阅读更多
个人分类: 计算机体系结构
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭