[zt] Big-Endian VS Little-Endian —— 从大头开始还是小头开始
http://hi.baidu.com/zotin/blog/item/17cb72f05ae600a6a50f52a2.html
剥鸡蛋从哪头开始,有人注意过这个问题吗?我认真地回想了一下,发现我多数情况下会从大头开始,但也有从小头开始的时候。如果为这样的一个问题发生争执,甚至形成“派系”,这是不是很好笑。在《格利佛游记》就有这样两个好笑的派系。这两个派系诞生在小人国,从大头开始剥的人叫“Big-Endian”,从小头开始吃的人叫“Little-Endian”。
人小鸡蛋相对自然就大了,怎么吃也就是大事了,争执一下情有可原。在我们看来,为这种琐碎争吵实在有点可笑,然而在另一件琐碎的事上,却发生了类似的争吵。这就是字节序问题。对计算机底层知识了解一点的人都知道,1个字有2个字节,双字有4个字节。但很多人都不怎么关心这2个或者4个字节是怎么存储的。比如一个字0x1234,0x12和0x34这两个字节存储的地址哪一个大?对这个问题的第一反应多数恐怕是怎么存放都没关系。的确这是一个小问题,但却曾引起了不小的争吵。直到有人写了一篇"On Holy Wars and a Plea for Peace"才平息了这种争吵。作者在最后提出的观点是在某些情况下,统一一种方式是必要的,但不必为这种问题做过多的争论,任选一种就可以了。他将认为字节序应该从大数开始人称为Big-Endian,而小数开始的人称为Little-Endian。Endian被翻译成字节序,而Big-Endian和Little-Endian就翻译成大端序和小端序。这个叫法的调侃味道荡然无存了。因为中国人看过《格利佛游记》人很少,所以这也实在是没办法的事。
以前我老是记不清楚Big-Endian和Little-Endian,看了这个“典故”以后到一下记住了,地址当然是从低的开始,低位的数字较小,所以从大头开始的Big-Endian的低字节当然存储的是高位,相应的从小头开始的Little-Endian低字节存储的是低位。可见,多知道一点“典故”不但有趣,而且有时候还有用。
http://hi.baidu.com/zotin/blog/item/3d35aa64d0bd1df9f63654b0.html
如果是剥水煮鸡蛋,通常是从大头开始的。因为大头有个气室,比较容易打破。有趣的是,对应的一般人也会觉得Big-Endian更自然一些。比如0x1234 = 0x1200 + 0x34,0x1200比较大,放在开始的地址(较低的地址),那么用2进制编辑软件打开的时候,看到的就是
![](http://hiphotos.baidu.com/zotin/pic/item/fc5fe850b77ce6741138c233.jpg)
这个确实比较自然,相对的,Little-Endian的看到的就会是34 12,感觉比较古怪了。而且如果这儿有一大堆数字。你想从中找到某个已知的多字节整数,那你首先要在把几个字节交换一下位置再找,这个就真的有点麻烦了。所以在网络上传输2进制文件的时候,用的都是Big-Endian。
那么为什么有的系统还是会用Little-Endian呢?其实很简单,就是当时在设计系统的时候,设计者觉得Little-Endian更自然。这就奇怪了,刚才不是说Big-Endian更自然吗?会有两个“更自然”到不是因为我喜欢和稀泥(虽然我到真的有点喜欢和稀泥),而是站的角度不一样。Little-Endian的自然表现在:高位的地址较高,低位的地址较低。如果这仅仅只是字面上的自然到也没什么说服力。看具体的:
int integers[] = {1};
int endian = (*(char*)integers)&1;
这儿的endian的值是多少?x&1是取x的最低位,所以自然的会想到结果是1,如果是Little-Endian,是对的。但如果是Big-Endian,不好意思,是0。因为取的是最高的字节的最低位。在进行低级的位运算处理的时候,在很多情况下Big-Endian的系统的的确确是会比Little-Endian多写一些代码。这就是为什么像x86这样的系统会选择Little-Endian的原因。
结果,两种情况都有了,两种支持者都拥有自己觉得的“自然”,最后的不“自然”留给了那些需要同时处理两种情况的人 —— 比如需要用x86处理网络上传输的2进制数据的人。他们很不爽的想:“为什么他们就不能统一一下呢?” —— 没办法,这个世界上总要有人吃亏,还是老老实实的做一个转换程序吧,往事不可以追,这个现况是不可能改变了。
==============================================================================
http://blog.csdn.net/iezzuchen/archive/2010/03/25/5416469.aspx
little endian和big endian是表示计算机字节顺序的两种格式,所谓的字节顺序指的是长度跨越多个字节的数据的存放形式。
little endian把低字节存放在内存的低位地址;而big endian将低字节存放在内存的高位地址。
假设从地址0x00000000开始的一个字中保存有数据0x1234abcd,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为:
big-endian little-endian
0x00000000 0x12 0xcd
0x00000001 0x23 0xab
0x00000002 0xab 0x34
0x00000003 0xcd 0x12
需要特别说明的是,以上假设机器是每个内存单元以8位即一个字节为单位的。
现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian。
如何判断CPU是little endian还是big endian呢?
union { long Long; char Char[sizeof(long)]; }u; int main() { u.Long = 1; if (u.Char[0] == 1) { printf("Little Endian!/n"); } else if (u.Char[sizeof(long) - 1] == 1) { printf("Big Endian!/n"); } else { printf("Unknown Addressing!/n"); } return 0; }
[zt] Big-Endian VS Little-Endian —— 从大头开始还是小头开始相关推荐
- 一个由“大头儿子带小头儿子吃饭”引发的血案
在群里讨论JavaScript,然后得出了这几种写法,感觉是层层递进,想了想,最后选择发布成文章 ({baby : '大头儿子',dady : '小头爸爸',run : function() {con ...
- 高数 | 【极限】来 抓大头与抓小头
一.抓大头 (1)狭义的抓大头 是指求极限 分子分母分别"抓"x的最高次项,忽略低次项. 之所以在分子分母中抓x的最高次项:x趋向于时,最高次项趋向于的速度最快. (2)广义的抓大 ...
- 【网络编程】大端模式和小端模式(大头序和小头序)
转自:http://my.oschina.net/renhc/blog/37130 大端:多字节值的大端存储在该值的起始位置:(老大站排头为大) 小端:多字节值的小端存储在该值的起始位置:(老小站排头 ...
- Unicode、UTF-8、Big Endian、Little Endian、GBK、UCS-2
Unicode.UTF-8.Big Endian.Little Endian.GBK.UCS-2 一.Unicode.UCS.GBK 1.开始计算机只在美国用.八位的字节一共可以组合出256(2的8次 ...
- big endian and little endian
big endian(大端)和little endian(小端)表示机器对变量字节的存储顺序.big endian表示低地址存放最高有效字节,little endian表示低地址存放最低有效字节.这里 ...
- URL编解码、Big Endian和Little Endian
一.Endian的起源 在各种计算机体系结构中,对于字节.字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特.字节.字.双字等等)应该以什么样的顺序进行 ...
- CPU中的Little Endian与Big Endian
CPU中的Little Endian与Big Endian 今天在学习利用buildroot编译软件包的时候,make menuconfig之后在Target Architecture选项中发现了同一 ...
- VB 文件编码互换模块(支持 Ansi,UTF-8,Unicode(little endian),Unicode big endian)
'VB 文件编码互换模块,支持对Ansi,UTF-8,Unicode(little endian),Unicode big endian编码之间进行转换. Option Explicit Privat ...
- Little endian和Big endian的区别
许多嵌入式系统程序员对Little endian和Big endian模式的概念模糊不清,其实Little endian和Big endian是多字节寻址的微处理器中,两种数据书写和存储顺序的排列方式 ...
最新文章
- 剑桥大学2020《AI全景报告》出炉,177页ppt
- 全球及中国甲基全氟异丁醚行业竞争现状与投资战略前景研究报告2022版
- 为何 epoll 的 ET 模式一定要设置为非阻塞IO
- SpringBoot应用日志通过logstash远程上传到ES
- Zotero参考文献管理
- 腾讯为什么不开发linux软件下载,你认为国产操作系统如何搭建生态?为什么腾讯不给Linux系统适配QQ?...
- C语言 | 6种常用的转换工具函数盘点
- hdfs 多个文件合并_hadoop学习笔记3 hadoop程序将本地文件夹中多个文件,合并为一个文件并上传到hdfs中--梦飞翔的地方(梦翔天空)...
- 算术编码(Arithmetic Coding)源代码
- php curl 批量,关于用php的curl批量抓取内容
- 小白设计模式:责任链模式
- verilog实现多周期处理器之——(二)第一条指令ori的实现
- vr全景拍摄教程,怎样拍摄vr全景照片?
- 农历php,php 阴历-农历-转换类代码
- Vue.js 核心精要实战解析
- 51单片机 引脚功能定义,内部框图
- finalcut剪切快捷键_Final Cut Pro 笔记(一) 常用快捷键与技巧
- 快手治理低质量直播内容,运营者需要注意什么?
- 《科学:无尽的前沿》笔记
- mysql 笛卡尔积影响_SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积
热门文章
- lbm 弛豫时间_学习格子 Boltzmann 方法(LBM)该如何入门,需要有哪些前置知识?...
- 7-5 输出大写英文字母
- Excel如何把事务型数据转化为可以直接关联性分析数据
- 关于“​​​​​​\u200B“非法字符(不可见字符)的 ‘坑’
- Ubuntu18 编译 AOSP 步骤
- JavaScript进阶面向对象ES6整合篇
- ubuntu18.04安装qq
- Blockchain区块链的通俗解释
- 无畏谣言,中科灵芝孢子油将科学进行到底!
- js 判断昨天,前天,去年