一、什么是大小端模式
- 大端模式(big endian)和小端模式(little endian)。
- 在串口等串行通信中,一次只能发1个字节。这个时候遇到一个问题。int类型有4个字节。我们是按照什么顺序发送字节呢。发送方和接收方必须按照同样的字节顺序来通信。这就是通信系统中的大小端模式。
- 现在我们讲的大小端模式讲的更多的是计算机存储系统的大小端。在计算机内存/硬盘/Nnad中.因为存储系统是32位的,但数据仍然按照字节为单位,于是一个32位的二进制在内存中存储时有两种分布方式。
- 高位低位,高地址低地址。
- 高位对应高地址:大端存储模式。
- 高位对低地址:小端存储模式。
- 大端模式和小端模式本身没有好坏。但必须要求存储和读取时按照同样的大小端模式,否则会出错。
- 现实是有些cpu公司用大端(c51),有些用小端(arm、intal)。大部分用小端,大端模式的不是很多。当不知道当前环境是用大端还是小端,就需要用代码检测当前系统的大小端。
二、用union来测试机器的大小端
- a和b都是从低地址开始访问的。
- 假设u1所在的4字节地址分别是0123,a自然是0123;b所在的地址是0而不是3。
- 代码后面不能定义变量。
#include <stdio.h>
union myunion
{
int a;
char b;
};
int is_little_ending(void)
{
union myunion u1;
u1.1=1;
return u1.b;
}
int main(void)
{
int i=is_little_ending(void);
if(i==1)
{
printf("小端模式.\n")
}
else
{
printf("大端模式.\n")
}
return 0;
}
三、用指针方式来测试机器的大小端
#include <stdio.h>
int is_little_ending(void)
{
int a=1;
char b=*((char *)&a);
return b;
}
int main(void)
{
int i=is_little_ending(void);
if(i==1)
{
printf("小端模式.\n")
}
else
{
printf("大端模式.\n")
}
return 0;
}