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

目录​​​​​​​

1. 大小端介绍

2. 判断大小端

2.1 指针法

2.2 联合体法

3. 主函数

4. 输出结果


1. 大小端介绍

大小端指的是 数据 在 内存 中的 存储模式(形式)。

  • 大端字节序
    • 一个数据的 低位字节序 的内容存放在 高地址 处,而 高位字节序 的内容存放在 低地址 处。
  • 小端字节序
    • 一个数据的 高位字节序 的内容存放在 高地址 处,而 低位字节序 的内容存放在 低地址 处。

2. 判断大小端

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

  • 大端

                             

  • 小端

                              

由内存布局图可知:我们只需要判断 低地址处是否为 1 即可。

当前系统为大端存储模式时,其低地址处存储 00,而当前系统为小端存储模式时,其低地址处存储 01

2.1 指针法

那么这个问题可简化为只判断一个字节的内容是否为 1,而当前数字为整型,这里对该数字强制类型转换为 char 类型即可。

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

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

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

优化:直接返回 *p

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

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

  不足:创建了指针变量 p

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

int JudgeSystem(void) {
	int a = 1;

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

2.2 联合体法

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

i 和 c 共用一块 4 个字节的内存,这样在更改 c 的时候 i 就会发生变化,而更改 i 的时候 c 也会发生变化。

int JudgeSystem(void) {
	union {
		char c;
		int i;
	} un; // 匿名联合体 un

	un.i = 1;

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

3. 主函数

#include <stdio.h>

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

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

	return 0;
}

4. 输出结果

  • 17
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值