简单介绍一下大小端模式:
像内核开发,网络开发,以及嵌入式开发都要涉及以位为单位来操作,所以都要考虑大小端问题。
大端模式:数据的高位,存放在地址的低位。
小端模式:数据的高位,存放在地址的高位。
介绍三种判断本机大小端模式的程序:
① 通过位移操作
#include <stdio.h>
#include <stdlib.h>
#define panduan(x) (x>>1)?(printf("It is big endian\n")):(printf("It is litter endian\n"))
int main()
{
char a = 1;
panduan(a);
printf("%#x\n",a);
printf("%#x\n",a>>1);
return 0;
}
地址: 高地址 <<====== 低地址
小端模式存放:0000 0001 >> 1 == 0000 0000
大端模式存放:1000 0000 >> 1 == 0100 0000
② 通过数据类型强制转换
#include <stdio.h>
#include <stdlib.h>
//#define panduan(x) (x>>1)?(printf("It is big endian\n")):(printf("It is litter endian\n"))
int main()
{
unsigned short a = 1;
char c = (char)a;
//panduan(a);
//printf("%#x\n",a);
//printf("%#x\n",a>>1);
printf("%#x\n",a);
printf("%#x\n",c);
(c)?(printf("It is litter endian\n")):(printf("It is big endian\n"));
return 0;
}
数据类型强制转换,其实本质还是取低8位数来判断。
③ 通过共同体
#include <stdio.h>
#include <stdlib.h>
//#define panduan(x) (x>>1)?(printf("It is big endian\n")):(printf("It is litter endian\n"))
typedef union test{
int a;
char c;
}czg;
int main()
{
czg t;
t.a = 1;
//unsigned short a = 1;
//char c = (char)a;
//panduan(a);
//printf("%#x\n",a);
//printf("%#x\n",a>>1);
//printf("%#x\n",a);
//printf("%#x\n",c);
printf("%#x\n",t.a);
printf("%#x\n",t.c);
//(c)?(printf("It is litter endian\n")):(printf("It is big endian\n"));
(t.c)?(printf("It is litter endian\n")):(printf("It is big endian\n"));
return 0;
}
和②本质上是一样的。
共用体里面的成员共用一个内存空间,而且是从低位开始占用,共用体变量的内存空间大小是该变量中某个占用空间最大的那个成员所占的空间。比如上面的结构体变量的空间就是int a占空间的大小,char c是从低位开始占用,也就是占用int a的低8位。