首先,需要明确什么是little endian 以及 big endian 模式?
例如,假设从内存地址0x0000 开始有以下数据:
0x12 0x34 0xab 0xcd
如果我们去读取一个地址为0x0000 的四个字节变量,若字节序为big-endian,则读出结果为0x1234abcd;若字节序位little-endian,则读出结果为 0xcdab3412。如果我们将0x1234abcd 写入到以0x0000 开始的内存中,则Little endian 和Big endian 模式的存放结果如下:
地址 0x0000 0x0001 0x0002 0x0003
big-endian 0x12 0x34 0xab 0xcd
little-endian 0xcd 0xab 0x34 0x12
就是判断 计算机的字节储存顺序 是大端还是小端 左低位右高位
Little endian:按照从低地址到高地址存放数据的低字节和高字节。
Big endian:按照从低地址到高地址存放数据的高字节和低字节。
举个小例子:
地址
big-endian
little-endian
我们使用两种方法进行解决,这个判断问题:
第一种方法:通过指针强制类型转换并对整形数据的首字节进行赋值,判断该值付给了高值还是低值
代码如下:
第二种方法:使用union联合体进行解决。
众所周知,union联合体中得所有数据成员共享同一段内存,所有我们可以运用int和char共同组成一个union,然后对int型进行赋值1,判断char型的是不是等于1,如果等于1,说明是little endian,因为低地址存放了1,高地址存放了0.如果不等于1(实际等于0),说明是Big endian,因为高地址存放了1,低地址存放了0。
程序如下:
写一个函数,判定运算环境(16位以上字长)是little-endian 还是 big-endian(12分)
/* 函数返回 0:little endian,非零:big endian */
int is_little_endian(void)
{
int v = 1;
if(*((char *)&v) == 1) return 0;
return 1;
}
/* 函数返回 0:little endian,非零:big endian */
int is_little_endian(void)
{
int v = 1;
if(*((char *)&v) == 1) return 0;
return 1;
}
#include<stdio.h>
union A
{
char c;
int i;
};
int check()
{
A a;
a.i = 1;
return a.c;
}
int main()
{
if (check())
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
union A
{
char c;
int i;
};
int check()
{
A a;
a.i = 1;
return a.c;
}
int main()
{
if (check())
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
方法2:
写一个函数判断计算机的字节存储顺序是升序(little-endian)还是降序(big-endian)。
答:需要记住的是,小端模式下低字节内存放低位数据,即,对于int类型的数据0x12345678,最低地址放的是0x78。这个可以作为编程的依据:
http://blog.sina.com.cn/s/blog_788c13b00100u4w7.html