发新话题
打印

[CELL编程] Big endian和Little Endian

Big endian和Little Endian

PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是 little endian呢?
其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。
用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序:如下所示:
Big Endian

低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

因此在应用程序移植到spu上的时候,要注意.
比如判断一个字节流是否是0x1234结尾,在intel x86平台上是i
unsigned char str[4] ={0x12, 0x34};
int *p=&str;
if(*p==0x3412) printf("stream end with 0x1234");

在cell spu上则成为
unsigned char str[4] __attribute__ ((aligned(4)))={0x12, 0x34};
int *p=&str;
if(*p==0x1234) printf("stream end with 0x1234");
我的签名!

TOP

那intel X86为什么要用little endian呢?仅从例程来看
不是big endian更符合我们对数字的使用习惯么?
是否因为little endian在比较数字时更快呢?

TOP

可能因为内存分配策略不同,big endian 的系统分配内存的时候从低地址向高地址分配,越是后来分配的地址越高;little endian的系统分配内存的时候从高地址向低地址分配,越是后来分配的内存地址越低。这样理解和记忆big / little是不是更容易一些呢
Once upon a man.

TOP

<UNIX网络编程>第一卷3.4节(第三版)有讲这个:

freebsd4 % byteorder
i386-unknown-freebsd4.8: little-endian

macosx % byteorder
powerpc-apple-darwin6.6: big-endian

freebsd5 % byteorder
sparc64-unknown-freebsd5.1: big-endian

aix % byteorder
powerpc-ibm-aix5.1.0.0: big-endian

hpux % byteorder
hppa1.1-hp-hpux11.11: big-endian

linux % byteorder
i586-pc-linux-gnu: little-endian

solaris % byteorder
sparc-sun-solaris2.9: big-endian
Once upon a man.

TOP

发新话题