全部博文(573)
分类: 嵌入式
2015-12-07 15:54:33
1. 字节序问题的存在原因
自计算机采用byte作为存储单位起,字节序就是一个有争议的话题。这是因为我们通常处理的数据都是多字节数据,比如c语言中一个类型为int的变量,在内存中需要占用四个字节的地址空间(0x400, 0x401, 0x402, 0x403),那么如何将这个变量的值放在这四个字节中,就是字节序的问题。
针对这个问题,目前主要有两种规则,也就是数据按照大端序存放和小端序存放。在介绍这两种方式之前,先介绍一下,为什么把它们命名为大端和小端吧。
2. 名字的来历
“endian”一词来源于乔纳森·斯威夫特的小说格列佛游记。小说中,小人国为水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开而争论,争论的双方分别被称为“大端派”和“小端派”。以下是1726年关于大小端之争历史的描述:
“我下面要告诉你的是,Lilliput和Blefuscu这两大强国在过去36个月里一直在苦战。战争开始是由于以下的原因:我们大家都认为,吃鸡蛋前,原始的方法是打破鸡蛋较大的一端,可是当今皇帝的祖父小时候吃鸡蛋,一次按古法打鸡蛋时碰巧将一个手指弄破了。因此他的父亲,当时的皇帝,就下了一道敕令,命令全体臣民吃鸡蛋时打破鸡蛋较小的一端,违令者重罚。老百姓们对这项命令极其反感。历史告诉我们,由此曾经发生过6次叛乱,其中一个皇帝送了命,另一个丢了王位。这些叛乱大多都是由Blefuscu的国王大臣们煽动起来的。叛乱平息后,流亡的人总是逃到那个帝国去寻求避难。据估计,先后几次有11000人情愿受死也不肯去打破鸡蛋较小的一端。关于这一争端,曾出版过几百本大部著作,不过大端派的书一直是受禁的,法律也规定该派任何人不得做官。”
1980年,Danny Cohen,一位网络协议的早期开发者,在其著名的论文"On Holy Wars and a Plea for Peace"中,为平息一场关于字节该以什么样的顺序传送的争论,而第一次引用了该词。
3. 大小端解释
大端:一个多字节整数,数字的高位部分存放在内存的低地址单元。
小端:一个多字节整数,数字的低位部分存放在内存的低地址单元。
举个例子,如果有一个4字节的整数0x0A0B0C0D。
如果按照大端方式存储它在内存中的位置即为:
如果按照小端方式存储它在内存中的位置即为:
实际上,人们在哪种字节序更高效这个问题上,表现的就像吃鸡蛋的问题一样,没有技术上的原因。对于单一字节,大部分处理器以相同的顺序处理位元,因此存放方式和传输方式一致。但对于多字节,不同的处理器有不同的方式。
4. 大小端的应用
目前x86处理器以及大部分ARM处理器均使用的是小端方式,而SPARC、Motorola、PowerPC、IBM等使用的是大端方式。
通常,网络传输中使用的是大端方式。所以只要你的系统中需要处理网络过来的数据,你就需要考虑大小端的问题了。