Little endian 和Big endian 是CPU 存放数据的两种不同顺序。
对于整型、长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。
例如,假设从内存地址0x0000 开始有以下数据:
0x12 0x34 0xab 0xcd
如 果我们去读取一个地址为0x0000 的四个字节变量,若字节序为big-endian,则读出结果为0x1234abcd;若字节序位little-endian,则读出结果为 0xcdab3412。如果我们将0x1234abcd 写入到以0x0000 开始的内存中,则Little endian 和Big endian 模式的存放结果如下:
地址 0x0000 0x0001 0x0002 0x0003
big-endian 0x12 0x34 0xab 0xcd
little-endian 0xcd 0xab 0x34 0x12
一般来说,x86 系列CPU 都是little-endian 的字节序,PowerPC 通常是Big endian,还有的CPU 能通过跳线来设置CPU 工作于Little endian 还是Big endian 模式。
具体判断方式代码如下:
#include <stdio.h>
#include <stdlib.h>
int big_or_little_endian()
{
union data
{
int a;
char b;
}data;
data.a = 1;
return ( data.b==1 );
/*
联合体中每次只有一个变量赋值,且其他值被赋值为同样的值,所有数据都是从低地址开始存储.
因为int型数据存储地址范围比char型数据大,所以当int型数据存储到char中会被截断。
1 = 0x 00 00 00 01;若是小端模式,则低字节01存放到char中去,结果为1,返回值为1,小端模式;
若是大端模式,则高字节00存放到char中去,结果为0,返回值为0,大端模式。
*/
}
int main()
{
if( big_or_little_endian() )
printf("小端模式\n");
else
printf("大端模式\n");
return 0;
}