首页 > 代码库 > 判断机器大小端模式的方法

判断机器大小端模式的方法

首先我们要明白啥子叫大端模式、小端模式。

大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中;

小端模式,是指数据的高位,保存在内存的高地址中,而数据的低位,保存在内存的低地址中;

大端模式和我们的逻辑有点相反,而小端模式和我们的逻辑是一致的;

对于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;