字节排序函数
考虑一个16位的整数,它由2个字节组成,内存中存储这两个字节有两种方法,一种是将低序字节存储在起始地址,这称为小端(little–endian)字节排序;另一种是将高序字节存储在起始地址,这称为大端(big–endian)字节序。如图所示:
在该图中,我们在顶部标明内存增长的方向为从右到左,在底部标明内存地址增长的方向为从左到右。我们还标明最高有效位(MSB)是这个16位值最左边位,最低有效位(LSB)是这个16位值最右边一位。
实验代码如下:
#include "unp.h"
int main(int argc , char **argv)
{
union {
short s;
char c[sizeof(short)];
}un;
un.s = 0x0102;
printf("%s: ", CPU_VENDOR_OS);
if(sizeof(short) == 2)
{
if(un.c[0] == 1 && un.c[1] == 2)
printf("big--ending\n");
else if(un.c[0] == 2 && un.c[1] == 1)
printf("little--ending\n");
else
printf("unkown\n");
}else
printf("sizeof(short) = %d\n", sizeof(short));
exit(0);
}
我们在一个短整型变量中个存放2个字节的值0x0102,然后查看它的两个连续字节c[0]和c[1],以确定字节序。
字符串CPU_VENDOR_OS由GNU的autoconf程序在配置本书中的软件是确定的,他标识CPU的型号,厂家,和操作系统版本,运行效果如下:
unbuntu# ./a.out
i686-pc-linux-gnu: little--ending