注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

笑遍世界@网易博客

明天还会在路上……

 
 
 

日志

 
 
关于我

Stay hungry, stay foolish. 工作用脑,生活用心! 走过山重水复,必然迎来柳暗花明! 受苦的人没有悲观的权利,远征的人没有流泪的资格。 Live each day as if we should die tomorrow.

网易考拉推荐
 
 

大端、小端的区别(Big-endian or Little-endian)  

2012-01-04 22:00:36|  分类: 硬件常识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在不同的计算机体系结构中,对于数据(比特、字节、字等)的存储和传输机制有所不同;目前在各种体系结构的计算机中,主要采用的字节存储机制主要有两种:大端(Big-endian)和小端(Little-endian)。

字节序,又称端序,尾序,英文:Endianness。在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。

“endian”一词来源于乔纳森·斯威夫特的小说格列佛游记。小说中,小人国为水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开而争论,争论的双方分别被称为Big-endians和Little-endians。
1980年,Danny Cohen在其著名的论文”On Holy Wars and a Plea for Peace”中,为平息一场关于字节该以什么样的顺序传送的争论,而引用了该词。

首先有两个概念需要解释一下:
1.MSB(全大写)指the Most Significant Byte,指多字节序列中具有最大权重的字节。
2.LSB(全大写)指the Least Significant Byte,指多字节序列中具有最小权重的字节。
PS:小写的msb,lsb还有另外的意思,最高有效位(the Most Significant Bit,msb)和最低有效位(the least significant bit,lsb)。

大端(Big-endian):MSB放在低地址,LSB存放在高地址。(大端方式将高位存放在低地址)
小端(Little-endian):MSB存放在高地址,LSB存放在低地址。(小端方式将高位存放在高地址)

当然另外,还有一种混合序(mixed-endian or middle-endian),此处暂不解释了。

这个说的有点抽象,下面举个例子吧:
以一个数值为1029的整数(4个字节)为例子吧,其分别在大端和小端架构中的存储方式分别为下表所示:
Big-endian VS. Little-endian 
—————————————————————————-

Address  Big-endian  Little-endian  
0 byte  00000000  00000101  
1 byte  00000000  00000100  
2 byte  00000100  00000000  
3 byte  00000101  00000000  

—————————————————————————-

在主流的体系结构中,小端(Little-endian)的代表是我们最常用x86架构(包括x86_64),还有 6502 (including 65802, 65C816), Z80 (including Z180, eZ80 etc.), MCS-48, 8051, DEC Alpha, Altera Nios, Atmel AVR, SuperH, VAX, 和 PDP-11 等等;
大端(Big-endian)的架构有 Motorola 6800 and 68k, Xilinx Microblaze, IBM POWER, system/360, System/370 等等。
另外有一些架构的endian是可配置的,如下架构有配置endian为大端、小端中任一种的功能, ARM, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC 和 IA-64 等等。

下面,这个简单的C程序,可以查询出当前的架构是大端还是小端。

/*
* To check CPU is Little endian or Big endian.
* x86 is little-endian, many of other CPUs are big-endian.
* ARM is Bi-endian (configurable endian).
* Author: Jay Ren
* Date: 2012.01.04
*/
 
#include <stdio.h>
 
int main(int argc, char *argv[])
{
int num = 1;
if(*(char*)&num == 1)
printf("Your CUP is Little Endian.\n");
else
printf("Your CUP is Big Endian.\n");
}



参考:

http://en.wikipedia.org/wiki/Endianness

“Linux Kernel Development” book


From: http://smilejay.com/2012/01/big-endian_little-endian/

  评论这张
 
阅读(1271)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017