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; }
输出结果