在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