大端与小端

来源:互联网 发布:醒狮克格莫 淘宝 编辑:程序博客网 时间:2024/06/09 23:59

小端(高位存在高地址,低位存在低地址)

 

union   

 

   {    

       long    Long;

       char    Char[sizeof(long)];  

   }u;   

 

 

 

   bool    IsBigOrSmall()    //    1-小端(Intel);    0-大端(Motor)  

   {  

       u.Long    =    1;  

       if(    u.Char[0]    ==    1    )  

       {  

           return    1;  

       }  

       else    if(    u.Char[sizeof(long)-1]    ==    1    )  

       {  

           return    0;  

       }      

       throw(    "Unknown!"    );      

   }   

 

用于指代字节顺序,在网络传输和计算机硬件使用,通常表示逻辑最小处理单元大于物理最小处理单元时逻辑单元与物理单元的映射方式。通常情况下无论是大端还是小端都是以字节(8bit)计,在字节之内都是以大端顺序排列。但不排除以后随着计算机的发展将这个数字扩充。

 

字节排序

 含义

 

Big-Endian

 高位在前,低位在后。

 

Little-Endian

 低位在前,高位在后

 

 

请看下面这个例子:

如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为

           big-endian     little-endian

0x0000     0x12              0xcd

0x0001     0x34              0xab

0x0002     0xab              0x34

0x0003     0xcd              0x12

然后,假如需要从内存中取32位整数0x1234abcd中的高16位整数,就需要知道是不是big-endian,如果是,需要从0x0002地址中去取,如果是little-endian,则需要从0x0000中取。也即怎么存就怎么取。

 

在“小终结者”形式中,提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对一的关系,多重精度的数学函数就相对地容易写了。 

在“大 终结者”的形式中,靠首先提取高位字节,你总是可以由看看在偏移位置为0的字节来确定这个数字是正数还是负数。你不必知道这个数值有多长,或者你也不必过一些字节来看这个数值是否含有符号位。这个数值是以它们被打印出来的顺序存放的,所以从二进制到十进制的函数特别有效。因而,对于不同要求的机器,在设计存取方式时就会不同。

IBM 的370主机,多数基于RISC计算机,和Motorola的微处理器使用big-endian方法。TCP/IP也使用big-endian方法 (big-endian方法也叫做网络编码)。对于人来说我们的语言都是从左到右的习惯方式。这看上去似乎被认为是自然的存储字符和数字方式-你同样也希 望以同样的方式出现在你面前。许多人因此也会认为big-endian是流行的存储方式,正如我们平时所读到的。然而,Intel处理器 (CPUs)和DEC Alphas和至少一些在他们的平台的其他程序都是little-endian的。对于little-endian有一个问题,那就是如果你增加数字的 值,你可能在左边增加数字(高位非指数函数需要更多的数字)。因此,经常需要增加两位数字并移动存储器里所有Big-endian顺序的数字,把所有数向右移,这会增加计算机的工作量。不过,使用little-endian的存储器中不重要的字节可以存在它原来的位置,新的数可以存在它的右边的高位地址 里。这就意味着计算机中的某些计算可以变得更加简单和快速。

          低端利于计算机,高端利于人的想法

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hezhibo/archive/2008/05/02/2361589.aspx

原创粉丝点击