c语言大小端如何判断以及转换详解

1.大小端概念

所谓的大端模式,就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

所谓的小端模式,就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

2.普通变量和数组在大端小端模式是如何存放的

在这里插入图片描述

3.如何测试编译器是大端存储还是小端存储

测试代码

#include<stdio.h>
int is_lsb()
{
	union test
	{
		unsigned char a;
		unsigned int b;
	}data;
		data.b = 0X12345678;
	if (data.a == 0X78)
	{
		return 1;
	}
	else
		return 0;

}

int is_lsb1()
{
	unsigned int value = 0X12345678;
	unsigned char *ptr = NULL;
	ptr = (unsigned char*)&data;
	if (*ptr == 0X78)
		return 1;
	else
		return 0;
}
int main()
{
	if (is_lsb())
	{
		printf("小端");

	}
	else
		printf("大端");
	return 0;

}

测试截图

在这里插入图片描述

4.大小端如何转换

测试代码

//1.如何进行大小端转换(通过位操作)
#include<stdio.h> 

typedef unsigned int uint_32;
typedef unsigned short uint_16;

//16位
#define BSWAP_16(x) \
  
    (uint_16)((((uint_16)(x)& 0x00ff) << 8) | \

	(((uint_16)(x)& 0xff00) >> 8) \
	)



//32位   
#define BSWAP_32(x) \

    (uint_32)((((uint_32)(x)& 0xff000000) >> 24) | \

	(((uint_32)(x)& 0x00ff0000) >> 8) | \

	(((uint_32)(x)& 0x0000ff00) << 8) | \

	(((uint_32)(x)& 0x000000ff) << 24) \
	)

//无符号整型16位
uint_16 bswap_16(uint_16 x)
{

	return
		      (((uint_16)(x)& 0x00ff) << 8) | \

		      (((uint_16)(x)& 0xff00) >> 8);

}


//无符号整型32位
uint_32 bswap_32(uint_32 x)
{

	return
		     (((uint_32)(x)& 0xff000000) >> 24) | \

		     (((uint_32)(x)& 0x00ff0000) >> 8) | \

		      (((uint_32)(x)& 0x0000ff00) << 8) | \

		      (((uint_32)(x)& 0x000000ff) << 24);

}

int main(int argc, char *argv[])
{

	printf("带参宏输出结果:\n");  

	printf("%x\n", BSWAP_16(0x1234));

	printf("%x\n", BSWAP_32(0x12345678));

	printf("函数调用输出结果:\n");  

	printf("%x\n", bswap_16(0x1234));

	printf("%x\n", bswap_32(0x12345678));

	return 0;
} 


带参宏输出结果:
0x3412
0x78563412

函数调用输出结果:
0x3412
0x78563412

//2.数组的大小端转换也是如此,例如:unsigned int value=0x12345678用数组存储;

//小端转换为大端:
buf[0] = (u8)((value >>24)& 0xFF);buf[1] = (u8)((value >> 16) & 0xFF);
buf[2] = (u8)((value >> 8) & 0xFF);buf[3] = (u8)(value & 0xFF);

//大端转为为小端:
buf[0] = (u8)(value & 0xFF);buf[1] = (u8)((value >> 8) & 0xFF);
buf[2] = (u8)((value>>16) & 0xFF);buf[3] = (u8)((value >> 24) & 0xFF);

5.总结

小端模式 :
强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。

大端模式 :
符号位的判定固定为第一个字节,容易判断正负。

我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式,一般操作系统都是小端,而通讯协议是大端的。

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

倾听一分钟

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值