大小端模式1

一、什么是大小端模式

  • 大端模式(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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容