中国电子科技集团公司第三研究所--嵌入式
C编程实现判断电脑大小端?
大端模式,是指数据的高位保存在内存的低地址中,而数据的低位,保存在内存的高地址中;小端模式相反。
(和十进制的类似,左边的高位,右边的是地位)
对于16Bit的整数:0x1234存放到CPU中,采用大小端存储如图所示:
对于32Bit的整数:0x12345678存放到一个整型变量int中。采用大端和小端存储如图所示:
采用大端方式 进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。
在计算机系统中,我们是以字节为单位存储的,每个地址单元都对应一个字节,一个字节是8Bit。在C语言中,有一个字节的char类型,有两个字节的short int,也有4个字节的int类型。必然存在着多个字节的安排问题,因此就导致了大端存储和小端存储的模式。
方法一
对于用C判断大小端问题,可以定义变量并且赋值0x1234,我们通过读取内存低位的值,如果是数据的高位,则是大端模式,否则是小端模式。
#include <stdio.h>
int main()
{
short int x;
char x1,x2;
x = 0x1122;
x1 = ((char *)&x)[0]; //低地址
x2 = ((char *)&x)[1]; //高地址
if(x1 == 11)
printf("大端模式\n");
else
printf("小端模式\n");
return 0;
}
方法二
联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成员共享存储空间
#include<stdio.h>
union temp
{
short int a;
char b;
}temp;
int main()
{
temp.a = 0x1234;
if(temp.b == 0x12) //低字节存的是高字节数据
printf("大端模式");
else
printf("小端模式");
return 0;
}
方法三
和方法一一样,short int 占2个字节,char占一个字节,把short int 变量赋值给 char 变量,如果char 变量得到的是高位则是小端,如果得到是低位,则是大端。方法一通过指针,方法三直接是赋值。
#include<stdio.h>
int main()
{
short int i = 0x1234;
char c = i;
if(c == 12)
printf("大端模式");
else
printf("小端模式");
return 0;
}