大小端模式

详解一:

小字节序:(比如x86体系) 数据的低字节放在低地址处,比如一个整型数0x12345678,在内存中的
          分布为:
                   -----------
                   |    78   | xxxx_0000
                   -----------
                   |    56   | xxxx_0001
                   -----------
                   |    34   | xxxx_0002
                   -----------
                   |    12   | xxxx_0003
                   -----------
                
                   Little Endian

大字节序:(比如PowerPC体系) 数据的低字节放在高地址处,比如一个整型数0x12345678,在内存中的
          分布为:
                   -----------
                   |    12   | xxxx_0000
                   -----------
                   |    34   | xxxx_0001
                   -----------
                   |    56   | xxxx_0002
                   -----------
                   |    78   | xxxx_0003
                   -----------
                
                   Big Endian

 

判断大字节序和小字节序
#include <stdio.h>
void main() 
{
   int i = 0x12345678;
   if(*(char *)&i == 0x12)
        printf("Big endian\n");
   else if(*(char *)&i == 0x78)
        printf("LIttle endian\n")
把高有效位放在低地址段为大字节序,把低有效位放在低地址段为小字节序。
详解二:

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

如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。为简单起见,本文使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。 

 

地址偏移

大端模式

小端模式

0x00

12(OP0)

78(OP3)

0x01

34(OP1)

56(OP2)

0x02

56(OP2)

34(OP1)

0x03

78(OP3)

12(OP0)

 

小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。
大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。
如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。 

 

地址偏移

大端模式

小端模式

0x00

12(OP0)

34(OP1)

0x01

34(OP1)

12(OP0)

 

由上表所知,采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。

有的处理器系统采用了小端方式进行数据存放,如Intel的奔腾。有的处理器系统采用了大端方式进行数据存放,如IBM半导体和Freescale的PowerPC处理器。不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择。

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

【用函数判断系统是Big Endian还是Little Endian】

//如果字节序为big-endian,返回true;
//反之为   little-endian,返回false

bool IsBig_Endian()
{
    unsigned short test = 0x1234;
    if(*( (unsigned char*) &test ) == 0x12)
       return TRUE;
   else
       return FALSE;

 

}//IsBig_Endian()

 

附:

  大小端的分度值是 byte,即每一个byte都是按照正常顺序,但是byte组装成一个int 或者是 long等时每个byte的摆放位置不同

利用联合体检测系统的大小端存储模式一例
#include <stdlib.h>
#include <stdio.h>
/**********************************************************************
 *
 *   联合体的概念和特征
 *   内存存储的大端模式(Big-endian)和小端模式(Little-endian)
 *   判断当前系统的大端还是小端一例
 *
 **********************************************************************/

int checkSystem();

int main(int argc, char * argv[])
{

    int res = checkSystem();
    if(res)
    {
        printf("this is Little_endian\n");
        
    }else
    {
        printf("this is Big_endian\n");
        
    }
    
    
}
int
checkSystem()
{
    union checkdata
    {
        int i;
        char ch;
        
    } check;  //定义一个有两个数据项的联合体,特征就是任何一个元素均是从联合体的基地址开始存储或保存
    check.i = 1;
    return (check.ch == 1);
    
}

注:

1)联合体的概念和特征:union维护足够的空间来存放多个数据成员中的“一种”,而不为每一个数据成员都配置空间,在union中所有的成员共用同一个空间,同一时间只存储一个数据成员,最大的特征就是所有的数据成员具有相同的起始地址即联合体的基地址。

2)计算机中字节存储主要有两种:大端模式(Big_endian)和小端模式(Little_endian),从英文名字上可以明白,大端模式是从低地址开始,高位结束;小端模式是从高地址开始,低地址结束。

3)利用union中所有数据成员具有同样的起始地址的特点,通过一个int成员存储1,然后通过char成员来读取,即可巧妙地得出数据存放的方式,若通过char成员(即读取起始位置上的第一个字节)读取,若得出值为1,则说明是小端模式。

通过GCC编译运行,运行结果跟计算机有关,(有的计算机支持两种模式,可通过设置来切换),在我机器上运行结果是:this is Little_endian


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值