c语言大小端如何判断以及转换详解
程序员文章站
2022-04-22 12:07:51
...
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都为小端模式,一般操作系统都是小端,而通讯协议是大端的。