大端模式与小端模式
对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在存储器中如何安排这些字节。在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节的最小地址。例如,假设一个型为int变量x的地址为0x100,也就是说,地址表达式&x的值为0x100。那么,x的4个字节被存储在存储器的0x100,0x101,0x102和0x103位置。
排列表示一个对象的字节有两个通用的规则。考虑一个w位的整数,位表示为[Xw-1,xw-2,...,x1,x0],其中xw-1是最高有效位i,而x0是最低有效位,假设w是8的倍数,这些位就能被分组成字节,其中最高有效字节包含位[xw-1,xw-2,...,xw-8],最低有效字节包含位[x7,x6,...,x0],其他字节包含中间的位。某些机器选择在存储器中按照从最低有效字节到最高有效字节的顺序存储对象,而另一些机器则按照从最高有效字节到最低有效字节的顺序存储。前一种规则——最低有效字节在最前面的方式,称为小端法(little endian)。大多数intel兼容机都采用这种规则。后一种规则——最高有效字节在最前面的方式,称为大端法(big endian)。大多数IBM和Sun Microsystems的机器都采用这种规则。
继续我们前面的示例,假设变量x类型为int,位于地址0x100处,它的十六进制值为0x1234567.地址范围为0x100~0x103的字节,其排列顺序依赖于机器的类型。
注意,在字0x01234567中,高位字节的十六进制值为0x01,而低位字节值为0x67。
如何判断大端模式和小端模式
方法一
void CheckEndian() { short a = 0x1234; char* p = (char*)&a; if ((*p) == 0x12){ printf("Big Endian\n"); } else if ((*p) == 0x34) { printf("Little Endian\n"); } }
方法二:
void CheckEndian() { union Num { short a; char b; } num; num.a = 0x1234; if (num.b == 0x12) { printf("Big Endian\n"); } else if (num.b == 0x34) { printf("little Endian\n"); } }
参考资料:
1. http://blog.csdn.net/ce123_zhouwei/article/details/6971544