C语言判断cpu是大端还是小端

Python017

C语言判断cpu是大端还是小端,第1张

在C语言中,不同于结构体,共用体(联合体)中的几种不同类型的变量存放在同一段内存单元中。利用这一特点,可以用联合体变量判断ARM或x86环境下,存储系统是是大端还是小端模式

#include "stdio.h"

int main()

{

  union w

 {

  int a  //4 bytes

  char b //1 byte

 } c

  c.a=1

  if (c.b==1)

  printf("It is Little_endian!\n")

  else

  printf("It is Big_endian!\n")

  return 1

}

union Charge

{

char arr[2]

short num

}

int main()

{

union Charge charge

charge.arr[0] = 1

charge.arr[1] = 2

if (charge.num == 0x0201)

{

printf("小端\n")

}

else

{

printf("大端\n")

}

return 0

}

在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节=8bit。在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器)。对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,如何安排多个字节的存储,这就有了大端存储模式和小端存储模式。

小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。

大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。

如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。

C语言判断大小端模式

方法一:

voidIsBigEndian()

{

    shortinta=0x1122//十六进制,一个数值占4位charb =  *(char*)&a//通过将short(2字节)强制类型转换成char单字节,b指向a的起始字节(低字节)

    if( b ==0x11) //低字节存的是数据的高字节数据

    {

        //是大端模式

    }

    else

    {

        //是小端模式

    }

}

方法二:

voidIsBigEndian() //原理:联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成员共享存储空间

{

    uniontemp

    {

        shortint a

        char b

    }temp

    temp.a=0x1234

    if(temp.b==0x12) //低字节存的是数据的高字节数据

    {

        //是大端模式

    }

    else

    {

        //是小端模式

    }

}

参考:https://www.jianshu.com/p/152268b0ea19