什么是机器的大小端。
《深入理解计算机系统》给出的解释是:某些机器选择在存储器中按照最低有效字节到最高有效字节的顺序存储对象,而另一些机器则按照从最高有效字节到最低有效字节存储的顺序存储对象。前一种规则——最低有效字节在最前面的方式,称为小端法(little endian)。大多数Intel兼容机都采用这种小端模式的规则。后一种规则——最高有效字节在最前面的方式,称为大端法(big endian),大多数IBM和Sun Microsystems的机器都采用这种规则。
下面举例说明大端和小端。
假设变量x的类型为int,位于地址0x100
处,它的十六进制值为0x12345678
。地址范围为0x100------0x103
,其排序依赖于机器的类型。
一.利用共用体进行测定。
原理:由于共用体类型采取的是存储覆盖的机制,准许不同的类型数据相互覆盖,是一种同一存储区域由不同类型成员共享的数据类型。
共用体是多种数据的覆盖存储,几个不同的成员 变量共占同一段内存空间,而且都是从同一地址开始存储的,只是在任意时刻只存储一种数据,因此分配给共用体的存储区域大小至少要有存储最大一个成员数据类型所占用的存储空间。
利用上述特性,就可以进行机器大小端的测试。
typedef union un
{
int a;
char ch;//注意:由于共用体不是同时存放多个成员的值,因此共用体变量不能进行初始化
}un;
int main()
{
un y;
y.a = 0x12345678;//对共用体中整形变量a进行初始化
if(y.b == 0x78)//有共用体的机制决定
{
printf("小端模式!\n");
}
else
{
printf("大端模式!\n");
}
return 0;
}
二.利用强转指针实现
虽然在32位操作系统下,所有指针类型的大小均为4字节。但是不同类型的指针进行解引用的能力是不相同的,利用这个特性,进行机器大小端的测试。
#include<stdio.o>
int main()
{
int a = 0x12345678;//十六进制值为0x12345678
char *p = (char*)&a;//强转地址,使得指针p仅可以解引用到一个字节大小的值
if(*p == 0x78)
{
printf("小端模式!\n");
}
else
{
printf("大端模式!\n");
}
return 0;
}