最近看资料的过程中,对大端和小段的问题又差点搞糊涂了,今天特意查了资料,总结了本文,读起文档来,又酣畅了不少,所谓胸中有丘壑,自然心中不慌。
主要还是以前对大端小端的理解太肤浅,仅限于会解几道题,今天读了几篇博文,发现大端小端还细分为字节序和比特序,这才结了我心中疑惑。
1.首先讲一下字节序的规则,先科普一下,字节是计算机存储数据的基本单位,1byte=1B=8bit,废话不多表,进入正题。大端还是小端是指字节在内存中的存储顺序。大端字节序,高字节存于内存低地址,低字节存于内存高地址;小端字节序反之。(这句话是精华)
以64位为例,大端模式下64位数据总线(或外部总线)的msb是第0位,MSB是数据总线(或外部总线)的第0~7的字段;而lsb是第63位,LSB是第56~63字段。小端模式下64位总线的msb是第63位,MSB是数据总线(或外部总线)的第63~56位,lsb是第0位,LSB是7~0字段。
如一个64位long型数据0x123456789abcdef0
大端字节序:
内存高地址--> 0xf0
0xde
0xbc
0x9a
0x78
0x56
0x34
内存低地址--> 0x12
小端字节序:
内存高地址--> 0x12
0x34
0x56
0x78
0x9a
0xbc
0xde
内存低地址--> 0xf0
IBM和Freescale的PowerPC处理器使用大端模式,而Intel的Pentuim处理器使用小端模式。另外,互联网使用的网络字节顺序采用大端模式进行编址,这多半是因为PowerPC主导了通讯市场。另外一些设备,例如PCI的寄存器是小端的,开发人员需要注意PCI字节序是小端的问题,可以借助<asm/byteorder.h>中的函数去实现系统字节序向PCI字节序的转变。
2.再来讲一下字节内的比特序,无论是大端还是小端,都有自己约定俗成的寄存器,数据总线的比特序定义,这一点在阅读文档的时候就能体会到啦。
一个采用大端模式的64位处理器,如基于Freescale e6500内核的T4240QDS,将其寄存器的最高位msb(most significant bit)定义为0,最低位lsb(lease significant bit)定义为63;而小端模式的64位处理器,将其寄存器的最高位定义为63,低位地址定义为0。
采用大端模式的64位处理器数据总线的最高位为0,最低位为31;采用小端模式的64位处理器的数据总线的最高位为31,最低位为0。如图4.5所示。
大端:0------------------------------->63
小端:63-------------------------------->0
图:大小端模式处理器的寄存器的定义
还是以上述数据0x00000001为例,其在内存中的存储
大端序:内存低比特位 00000001 内存高比特位
小端序:内存低比特位 10000000 内存高比特位
主要还是以前对大端小端的理解太肤浅,仅限于会解几道题,今天读了几篇博文,发现大端小端还细分为字节序和比特序,这才结了我心中疑惑。
1.首先讲一下字节序的规则,先科普一下,字节是计算机存储数据的基本单位,1byte=1B=8bit,废话不多表,进入正题。大端还是小端是指字节在内存中的存储顺序。大端字节序,高字节存于内存低地址,低字节存于内存高地址;小端字节序反之。(这句话是精华)
以64位为例,大端模式下64位数据总线(或外部总线)的msb是第0位,MSB是数据总线(或外部总线)的第0~7的字段;而lsb是第63位,LSB是第56~63字段。小端模式下64位总线的msb是第63位,MSB是数据总线(或外部总线)的第63~56位,lsb是第0位,LSB是7~0字段。
如一个64位long型数据0x123456789abcdef0
大端字节序:
内存高地址--> 0xf0
0xde
0xbc
0x9a
0x78
0x56
0x34
内存低地址--> 0x12
小端字节序:
内存高地址--> 0x12
0x34
0x56
0x78
0x9a
0xbc
0xde
内存低地址--> 0xf0
IBM和Freescale的PowerPC处理器使用大端模式,而Intel的Pentuim处理器使用小端模式。另外,互联网使用的网络字节顺序采用大端模式进行编址,这多半是因为PowerPC主导了通讯市场。另外一些设备,例如PCI的寄存器是小端的,开发人员需要注意PCI字节序是小端的问题,可以借助<asm/byteorder.h>中的函数去实现系统字节序向PCI字节序的转变。
2.再来讲一下字节内的比特序,无论是大端还是小端,都有自己约定俗成的寄存器,数据总线的比特序定义,这一点在阅读文档的时候就能体会到啦。
一个采用大端模式的64位处理器,如基于Freescale e6500内核的T4240QDS,将其寄存器的最高位msb(most significant bit)定义为0,最低位lsb(lease significant bit)定义为63;而小端模式的64位处理器,将其寄存器的最高位定义为63,低位地址定义为0。
采用大端模式的64位处理器数据总线的最高位为0,最低位为31;采用小端模式的64位处理器的数据总线的最高位为31,最低位为0。如图4.5所示。
大端:0------------------------------->63
小端:63-------------------------------->0
图:大小端模式处理器的寄存器的定义
还是以上述数据0x00000001为例,其在内存中的存储
大端序:内存低比特位 00000001 内存高比特位
小端序:内存低比特位 10000000 内存高比特位