本博文为原创,转载请注明出处 http://blog.csdn.net/lux_veritas/article/details/8240948
大端与小端,是数据在机器上(确切的说是在进程的虚拟地址空间上)两种不同的存储方式。
熟知大多数的计算机以Byte(8个bit位)作为最小的可寻址的存储单元。但是8bit最多可以表示大小为256的无符号数值,远远达不到系统所需的计算需求。
于是就产生了字(word,一般为2Byte),双字(4Byte)等较大的数据运算单位,但是其在存储器上存储仍是以Byte为单位的。这种多字节构成的数据单位便产生了字节序的问题。
获得一个数据的步骤简化如下:1.通过寻址定位到数据在虚拟地址空间的位置,2.通过数据类型的定义获得数据相对于该位置的偏移,3.通过大端小端的判断最终确定数值
如图,该图显示0x01234567分别在小端和大端的机器上上的存储方式:
所谓小端,最低有效字节(LSB,Least Significant Byte)在低地址处,最高有效字节(MSB,Most Significant Byte)在高地址处
同理大端,最高有效字节(MSB,Most Significant Byte)在低地址处,最低有效字节(LSB,Least Significant Byte)在高地址处
需要说明的一点是,在绝大多数的机器上,多字节的数据都是连续存储的字节序列,而要访问该数据的地址为存储的最低地址(如图中,address的位置)
可以写个小程序,测试一下你的机器是大端还是小端。
#include <stdio.h>
int machine_is_little_endian()
{
int data=0x01234567;
char *p;
p = (char *)&data;
printf("p_add: %p\n",p);
printf("p_val: %x\n",(*p));
if((*p)==0x67)
return 1;
else
return 0;
}
int main()
{
if(machine_is_little_endian() == 1)
printf("Little Endian Machine ...\n");
else
printf("ca ...\n");
return 0;
}
测试结果为:
[guohongwei@gc13:c_test]$ gcc -o play endian.c
[guohongwei@gc13:c_test]$ ./play
p_add: 0x7fff1c9db934
p_val: 67
Little Endian Machine ...
[guohongwei@gc13:c_test]$
笔者的机器为小端。