欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-22 12:07:51
...

1.大小端概念

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

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

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

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

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;

}

测试截图

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

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都为小端模式,一般操作系统都是小端,而通讯协议是大端的。

相关标签: C语言 大小端