大小端这个问题在面试过程中偶尔会被问到,这里笔者总结了一下,提出了两个小程序进行判断,欢迎大伙

查看指教

第一种:联合(union)方式判断法

在union中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同

的起始地址。即上述的union虽然定义了两个成员,但其实这个union只占用了4个字节(32位机器中),往a成员

赋值,然后读取b就相读取a成员的低位第一个字节的值。如果机器使用大端模式,则u.a=1那a的最高字节值为1;

如果机器使用小段模式,则u.a=1则a的最低位字节为1。上述可知b和a有相同的起始位,所以读取b如果等于1,

则为小端模式,b为0则为大端模式


typedef union {
	int i;
	char c;
}my_union;

int checkSystem1(void)
{
	my_union u;
	u.i = 1;
	return (u.i == u.c);
}




第二种称之为直接判断法,怎么直接判断呢,其实就是根据大小端各自的存储方式编写程序进行判断,这个方法更直接。



首先我们来看下大小端的存储方式:



大端模式(Big_endian)   -- 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。



小端模式(Little_endian)-- 字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。



根据这个特性,假设我们初始化了一个int变量i为0x12345678,其地址为0x100,根据定义在小端模式下



0x100一个字节内的值为0x78,类推0x101=>0x56,0x102=>0x34,0x103=0x12,根据这个编程如下



int checkSystem2(void)
{
	int i = 0x12345678;
	char *c = &i;
	return ((c[0] == 0x78) && (c[1] == 0x56) && (c[2] == 0x34) && (c[3] == 0x12));
}
int main(void)
{
	if(checkSystem1())
		printf("little endian\n");
	else
		printf("big endian\n");

	if(checkSystem2())
		printf("little endian\n");
	else
		printf("big endian\n");

	return 0;
}




如果返回1表示小端,反则表示大端;



我曾经在面试中被问及该问题,当时我用的是第一种方法,用口述方式进行的,我还没陈述完,面试官



就笑着说看来你是在网上看到了这样的方法,自己的理解不够深入! 他的话其实有点武断,用第一种



方法并不表明我就没有深入理解大小端。但是人都有主观判断性,面试官对我主观的印象就这样了!



所以以后面试还被问到就用第二种方法吧,这个描述起来,对方替听起来你总算是理解了大小端的本质



就是存储方式