【C】判断当前系统是大端还是小端

1、大小端介绍

  实际上,大小端指的是数据在内存中的存储模式。

大端字节序(存储模式)一个数据的低位字节序的内容存放在地址处,而高位字节序的内容存放在地址处。

小端字节序(存储模式)一个数据的高位字节序的内容存放在地址处,而低位字节序的内容存放在地址处。

2、判断当前系统是大端还是小端

  int a = 1;

  假设有一个数字为 a = 1,分别画出 a 在大端和小端两种情况下的内存分布。

a.大端

                             

b.小端

                              

  实际上,我们只需要判断低地址处是否为1。当前系统为大端存储模式时,其低地址处存储00,而当前系统为小端存储模式时,其低地址处存储01。那么这个问题可简化为只判断一个字节的内容是否为1,而当前数字为整型,这里对该数字强制类型转换为char型即可。

/*
*	函数名称:JudgeSystem
*
*	函数功能:判断当前系统是大端还是小端
*
*	入口参数:void
*
*	出口参数:0 or 1
*
*	返回类型:int
*/

int JudgeSystem(void)
{
	int a = 1;
	char * p = (char *)&a;

	if (1 == *p)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

  不足:代码繁琐,实际上 *p 的内容非 1 即 0。

  优化:直接返回*p。

/*
*	函数名称:JudgeSystem
*
*	函数功能:判断当前系统是大端还是小端
*
*	入口参数:void
*
*	出口参数:*p
*
*	返回类型:int
*/

int JudgeSystem(void)
{
	int a = 1;
	char * p = (char *)&a;

	//如果是小端则返回1,如果是大端则返回0
	return *p;
}

  不足:创建了指针变量 p。

  优化:直接返回 *(char *)&a。

/*
*	函数名称:JudgeSystem
*
*	函数功能:判断当前系统是大端还是小端
*
*	入口参数:void
*
*	出口参数:*(char *)&a
*
*	返回类型:int
*/

int JudgeSystem(void)
{
	int a = 1;

	//如果是小端则返回1,如果是大端则返回0
	return *(char *)&a;
}

  再介绍一种巧妙的方法,利用联合体去实现,

int i;
char c;
  i 和 c 共用一块 4 个字节的内存,如下图所示,


  这样在更改 c 的时候 i 就会发生变化,而更改 i 的时候 c 也会发生变化。

/*
*	函数名称:JudgeSystem
*
*	函数功能:判断当前系统是大端还是小端
*
*	入口参数:void
*
*	出口参数:un.c
*
*	返回类型:int
*/

int JudgeSystem(void)
{
	union Un
	{
		char c;
		int i;
	};

	union Un un;
	un.i = 1;

	//如果是小端则返回1,如果是大端则返回0
	return un.c;
}

  主函数

#define _CRT_SECURE_NO_WARNINGS 1

/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:JudgeSystem.c
* 功能:判断当前系统是大端还是小端
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年4月30日19:17:25
*/

# include <stdio.h>

int main(void)
{
	int ret = JudgeSystem();

	if (1 == ret)
	{
		printf("该系统是小端存储模式!\n");
	}
	else
	{
		printf("该系统是大端存储模式!\n");
	}

	return 0;
}

  输出结果

猜你喜欢

转载自blog.csdn.net/sustzc/article/details/80151244