首页 > 代码库 > 判断机器大小端模式的方法
判断机器大小端模式的方法
首先我们要明白啥子叫大端模式、小端模式。
大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中;
小端模式,是指数据的高位,保存在内存的高地址中,而数据的低位,保存在内存的低地址中;
大端模式和我们的逻辑有点相反,而小端模式和我们的逻辑是一致的;
对于32位的系统,他一个字长是4个字节。那么对于数据0x12345678
你可以在linux的目录下建立一个文件,将数据0x12345678输入进去,保存文件。
利用命令 od -x filename 查看
测试结果是:00000000 7830 3231 3433 3635 3837 000a
00000013
利用命令 hexdump -C filename 查看
测试结果是:00000000 30 78 31 32 33 34 35 36 37 38 0a
0000000b
利用C语言测试
1.通过读取同一地址的整型数据和字符数据来区分大端还是小端
#incude <stdio.h>
typedef unsigned int Type;
int main()
{
Type data, *point;
point = &data;
*(Type *)point = 0x12;
if(0x12 == data)
{
printf("Little-endian\n");
}
else if(0x00000012 == data)
{
printf("Big-endian\n");
}
else
{
printf("Unable to determine\n");
}
return 0;
}
2. 通过联合体union共享内存的特性,来判断是大端模式还是小端模式
#include <stdio.h>
typedef union
{
char ch;
int data;
}Udata;
int main()
{
Udata tmpData;
tmpData.data = http://www.mamicode.com/0x12345678;
if(tmpData.ch == 0x78)
{
printf("Little-endian\n");
}
else if(tmpData.ch == 0x12)
{
printf("Big-endian\n");
}
else
{
printf("Unable to determine\n");
}
return 0;
}
3.linux的开发者,在内核中可以这样来测试机器的类型
static union { char c[4]; unsigned long mylong; } endian_test = {{‘l‘,‘?‘,‘?‘,‘b‘}};
#define ENDIANNESS ((char)endian_test.mylong)
cout<<ENDIANNESS<<endl;