`
lhx1026
  • 浏览: 301274 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

[转]浅谈字节序(Byte Order)

    博客分类:
  • ss7
OS 
阅读更多

原文地址:http://www.cnblogs.com/JeffreyZhao/archive/2010/02/10/1667341.html

 

说到程序间的通信,说到底便是发送数据流。我们一般把字节(byte)看作是数据的最小单位。当然,其实一个字节中还包含8个比特(bit)──有 时候我奇怪为什么很多朋友会不知道bit或是它和byte的关系。当我们拿到一系列byte的时候,它本身其实是没有意义的,有意义的只是“识别字节的方 式”。例如,同样4个字节的数据,我们可以把它看作是1个32位整数、2个Unicode、 或者字符4个ASCII字符。

同 样我们知道,在一个32位的CPU中“字长”为32个bit,也就是4个byte。在这样的CPU中,总是以4字节对齐的方式来读取或写入内存,那么同样 这4个字节的数据是以什么顺序保存在内存中的呢?例如,现在我们要向内存地址为a的地方写入数据0x0A0B0C0D,那么这4个字节分别落在哪个地址的 内存上呢?这就涉及到字节序的问题了。

每个数据都有所谓的“有效位(significant byte)”,它的意思是“表示这个数据所用的字节”。例如一个32位整数,它的有效位就是4个字节。而对于0x0A0B0C0D来说,它的有效位从高到 低便是0A、0B、0C及0D——这里您可以把它作为一个256进制的数来看(相对于我们平时所用的10进制数)。

而所谓大字节序(big endian) ,便是指其“最高有效位(most significant byte) ”落在低地址上的存储方式。例如像地址a写入0x0A0B0C0D之后,在内存中的数据便是:

 



 而对于小字节序(little endian) 来说就正好相反了,它把“最低有效位(least significant byte) ”放在低地址上。例如:

 


    对于我们常用的CPU架构,如Intel,AMD的CPU使用的都是小字节序,而例如Mac OS以前所使用的Power PC使用的便是大字节序(不过现在Mac OS也使用Intel的CPU了)。此外,除了大字节序和小字节序之外,还有一种很少见的中字节序(middle endian),它会以2143的方式来保存数据(相对于大字节序的1234及小字节序的4321)。

关于字节序的详细说明,您可以参考Wikipedia里的Endianness条目

  • 大小: 19.5 KB
  • 大小: 18.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics