【转】大端(Big-endian)和小端(Little-endian)区别

大端和小端模式源于《格列佛游记》,在计算机中指数据在内存中的存放顺序。大端模式将高字节存放在低地址,小端则相反。文章通过例子展示了32位和16位整数在两种模式下的存储情况,并提供了一个C函数来判断系统是大端还是小端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大端(Big-endian) 和小端(Little-endian) 区别

     端模式(Endian )的这个词出自Jonathan Swift 书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian ,从尖头开始将鸡蛋敲开的人被归为Littile Endian 。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian )敲开还是从小头(Little-Endian )敲开。在计算机业Big Endian 和Little Endian 也几乎引起一场战争。在计算机业界,Endian 表示数据在存储器中的存放顺序。下文举例说明在计算机中大小端模式的区别。

     如果将一个32 位的整数0x12345678 存放到一个整型变量(int )中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。

地址偏移

大端模式

小端模式

0x4000

0x12

0x 78

0x4001

0x 34

0x 56

0x4002

0x 56

0x 34

0x4003

0x 78

0x 12

   

      如果将一个16 位的整数0x1234 存放到一个短整型变量(short )中。这个短整型变量在内存中的存储在大小端模式由下表所示。

地址偏移

大端模式

小端模式

0x4000

0x 12

0x 34

0x4001

0x 34

0x 12

 

     由上表所知,采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高字节存放在低地址,小端方式将低字节存放在低地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。有的处理 器系统采用了小端方式进行数据存放,如Intel 的奔腾。有的处理器系统采用了大端方式进行数据存放,如IBM 半导体和Freescale 的 PowerPC 处理器。不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择。

    因此在一个处理器系统中,有可能存在大端和小端模式同时存在的现象。这一现象为系统的软硬件设计带来了不小的麻烦,这要求系统设计工程师,必须深入理解大端和小端模式的差别。大端与小端模式的差别体现在一个处理器的寄存器,指令集,系统总线等各个层次中。

    注:原文出处 http://malonely.bloghome.cn/posts/159548.html

 

判断大端小端

问题:请写一个C 函数,若处理器是Big_endian 的,则返回0 ;若是Little_endian 的,则返回1

解答:

    int checkCPU( )

    {
           {
                    union w
                       { 
                               int a;
                                  char b;
                        } c;
                        c.a = 1;
                        return(c.b ==1);
            }
     }

剖析:

     嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little- endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址

内存地址

0x4000

0x4001

存放内容

0x34

0x12

而在 Big-endian 模式 CPU 内存中的存放方式则为:

内存地址

0x4000

0x4001

存放内容

0x12

0x34

 

32bit 宽的数 0x12345678 在 Little-endian 模式 CPU 内存中的存放方式(假设从地址 0x4000 开始存放)为:

内存地址

0x4000

0x4001

0x4002

0x4003

存放内容

0x78

0x56

0x34

0x12

而在 Big-endian 模式 CPU 内存中的存放方式则为:

内存地址

0x4000

0x4001

0x4002

0x4003

存放内容

0x12

0x34

0x56

0x78

     联合体 union 的存放顺序是所有成员都从低地址开始存放,面试者的解答利用该特性,轻松地获得了 CPU 对内存采用 Little-endian 还是 Big-endian 模式读写。如果谁能当场给出这个解答,那简直就是一个天才的程序员。

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/Linruin/archive/2009/10/13/4666603.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值