1.对不同类型的计算机而言,它们在一个字中使用的字节顺序约定会有所不同。有些计算机约定将最有意义的字节放在一个字的前面(称为big-endian顺序),而另一些计算机则约定将最有意义的字节放在后面(称为little-endian顺序)。这里“最有意义的字节”相对计算机所表示的一个数而言,指的是存放一个数最有意义位的字节。例如,对于整数而言,最有意义的位是最高位;对于浮点数而言,是存放阶码最高位的字节。
2.在采用big-endian顺序的计算机中,一个字的字节顺序由低地址至高地址编号,字节顺序与地址顺序是一致的。而在采用little-endian顺序的系统中,一个字的字节顺序由高地址至低地址编号,字节顺序与地址顺序相反。如下所示:
字节编号 0 1 2 3
big-endian 1 2 3 4 数字0x1234
地址A 地址A+1 地址A+2 地址A+3
字节编号 3 2 1 0
little-endian 4 3 2 1 数字0x1234
地址A 地址A+1 地址A+2 地址A+3
3.测试系统为big-endian还是little-endian的代码:
#include <sys/utsname.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
union {
short inum;
char c[sizeof(short)];
}un;
struct utsname uts;
un.inum = 0x0102;
/* 打印出CPU名,操作系统及其版本号 */
if(uname(&uts) < 0)
printf("Could not get host information\n");
printf("%s--%s--%s:", uts.machine, uts.sysname, uts.release);
/* 检测字节顺序 */
if(sizeof(short) != 2){
printf("sizeof short = %d\n", sizeof(short));
//exit(0);
}
if(un.c[0] == 1 && un.c[1] == 2)
printf("big_endian\n");
else if(un.c[0] == 2 && un.c[1] == 1)
printf("little_endian\n");
else
printf("unknown\n");
//exit(0);
//armv4l--Linux--2.4.18-rmk7-pxa1:little_endian
//i686--Linux--2.6.11-1.1369_FC4:little_endian
}
[ 此贴被XChinux在2006-12-24 10:49重新编辑 ]