什么机器的大小端?
某些机器选择在储存器中按照最低有效字节到最高有效字节的顺序储存对象,而另一些机器则按照从最高有效字节到最低有效字节储存的顺序储存对象。
前一种方式---最低有效字节在最前面的方式,成为小端法(little endian)。大多数Intel兼容机都采用这种小端模式的规则,后一种规则----最高有效字节在最前面的方式,称为大端法(big endian),大多数的IBM和Sun Microsystems的机器采用这种规则。
举例说明大小端
假设变量x的类型为int,位于地址0x100处,他的十六进制为0x12345678.地址范围为:0x100 --- 0x103,其储存的排列依赖于机器的类型。

方式一:利用共同体进行测试
原理:由于共同体类型采用的是储存覆盖机制,允许不同的类型数据相互覆盖,是一种同一储存区域由不同成员共享的数据类型。
共同体是多种数据的覆盖储存,几个不同的成员变量共同占同一段内存空间,而且都是从同一地址开始储存的,只是在任意时刻只储存一种数据,因此分配给共同体的储存区域大小至少要有储存最大一个成员类型所占用的储存空间。
利用上面的特性,就可以进行测试了:
typedef union un
{
int a;
char b;//注意:由于共用体不是同时存放多个成员的值,因此共用体变量不能进行初始化
}un;

int main()
{
un y;
y.a = 0x12345678;//对共用体中整形变量a进行初始化
if(y.b == 0x78)//有共用体的机制决定
{
printf("小端模式!\n");
}
else
{
printf("大端模式!\n");
}
return 0;
}
方式二:利用指针的强转
原理:虽然在32位系统下,所有指针类型的大小都为4个字节。但是不同类型的指针进行 解引用的能力是不相同的,利用这个特性,进行机器大小端的测试。
int main()
{
int a = 0x12345678;//十六进制值为0x12345678
char *p = (char*)&a;//强转地址,使得指针p仅可以解引用到一个字节大小的值
if(*p == 0x78)
{
printf("小端模式!\n");
}
else
{
printf("大端模式!\n");
}
return 0;
}
本文介绍了计算机存储中的大小端概念,小端法和大端法的区别,并通过两个方法详细解释如何测试机器的大小端:一是利用共同体的储存覆盖机制,二是借助不同类型指针的解引用特性。这两种方式能帮助我们理解不同机器如何存储数据。

1122

被折叠的 条评论
为什么被折叠?



