五千年(敝帚自珍)

主题:【原创】话说“字节优先” -- 你克我服

共:💬6 🌺8
分页树展主题 · 全看首页 上页
/ 1
下页 末页
  • 家园 【原创】话说“字节优先”

    那个那个,字节优先这个词儿,学计算机专业的朋友其实可能都不陌生。

    它的英文原名是――endian。中文译法嘛,有人叫它“位优先”,俺觉得还是叫“字节优先”比较合适,就算是老服自己起的好了。(^_^)

    说起字节优先来,那可就是“六月天里冻死只大灰狼――说来话长”了。

    首先要从“字节”这个单位说起。

    字节、这大概是世界上五花八门计算机最共同的单位了――从0到FF这么简单,

    换算成十进制也就是0-255这么大一个可以容纳256个数字的小盒子了。

    所以如果让计算机表达更多的数量、范围、精度,则少不了使用“多字节”来表示。

    比如汉字要想在计算机上表示,就有好几万字儿呢,因此产生出各种多字节编码来对应,

    有的是两字节、多的有四字节的呢。

    世界上的计算机处理器,对待多字节在内存里面的储存方法,大体上有两种存储方式流派

    一种叫做big-endian(高字节优先),一种叫做little-endian(低字节优先) *注

    好比一个汉字,它的编码是 “01 23 AB CDH”,由四个字节构成,在little-endian的世界里,

    它在内存里被放置的次序就是“CDH ABH 23H 01H”

    为啥会产生出两种正好相反的存储方式呢?

    很显然,big-endian方式是我们所熟知的计数方式,高位在前低位在后,就像“一万两千三百二十一”一样

    没有谁会倒着从低位向高位数算的........等等,真的如此么?

    其实在化学的世界里,“1234”就会被写成tetratriacontadictakilia,这里面tetra是4的意思、triaconta是30、dicta表示200、而kilia则表示1000的,嘿嘿,原来现实世界里的确就有倒着数数的人呢!

    习惯从高向低计数的,是我们东亚传统;而欧美则有广泛的从低向高记忆的倾向。不信?看看他们写信的地址好了,嘿嘿。都是“XX号XX街XX城市XX州,XX国”这么个顺序不是?这也是little-endian呢。

    这下就该不难理解为啥会有littl-endian的产生土壤了吧?

    计算机世界从最开始,就有着针锋相对的斗争,像IBM、Sun、Motorola这样的厂商,造出来的芯片都是big-endian;而Intel、DEC生产的CPU,则是典型的little-endian。

    两大阵营的对抗,一直持续到今天。那为啥叫big-endian/little-endian呢?

    这里头的典故还牵涉了《格列佛游记》进去呢!

    据说格列佛游记里有两派人也是如此激烈对抗,他们政治主张的区别,

    居然在于吃鸡蛋的时候究竟是从哪一头开始打破蛋壳――

    主张从尖的一端开始敲起的一派被称为“little-endian”;

    而主张从圆的一端开始敲碎的群众被叫做“big-endian”;

    两派人马也是和我们一样地势不两立,呵呵。

    由此,现实世界里主张把低位放在前面的流派(比如Intel)就被叫做了“little-endian”,

    而另一派自然而然成为了“big-endian”,自然而贴切!

    本来呢,big-endian和little-endian的计算机,他们各有各的用户、各有各的市场,互不相犯,倒也相安无事; 可自打有了网络、Internet,这麻烦可就大了――我给你传输一个多字节数据,还需要提前知道你的计算机字节顺序是哪个流派的不成?!这可实在是一笔糊涂账。

    结果呢,大家商量来商量去,还是决定网络上要按照最自然的big-endian传输数据(其实,这里还是有猫腻的――最早的Internet协议,都是UNIX上实现的、当时使用UNIX的计算机,十有八九是big-endian派的,嘿嘿,结果Windows/Intel这样后来的人就只有听人家的份儿了)。所以呢,我们在使用Windows上网的时候,其实数据在被发送之前呢,是被重新整理成big-endian以后才送出去的呢,对面要也是一台使用Intel芯片的计算机,也会把收到的数据颠倒一个个儿进行处理的。

    麻烦还不只如此,不少朋友用过模拟器程序,这种时候模拟的对象如果是和自己的计算有着不同endian的存储格式,那可就麻烦大了......最近最出名的就是新版的游戏机年底即将问世,SONY家里出的PlayStation3和微软计划中的XBOX360,都用的是IBM Cell芯片,这可是典型的big-endian;可是SONY和微软都信誓旦旦地向用户保证――我们要让新游戏机兼容从前的老版!SONY那边,PS1和PS2都是MIPS构造的处理器,也无一例外是big-endian的,使用软件模拟从前的处理器这还好说;可微软那边XBOX是Intel处理器的哦,这可是little-endian耶!不知道微软打算如何才能把这个兼容性做好,嘿嘿,嘿嘿。

    关于endian,最近还有一件大事、苹果公司放弃了一直在使用的IBM/Motorola的PowerPC芯片而改用Intel,这也是一次典型的endian改变。兼容性如何保持、用惯了big-endian的苹果程序员们,考验你们的时候可到咯~~~~~~~哈哈哈

    *注: 除了两种主流的endian方式,还有一些其他的方式。比如DEC PDP上就有被称为middle endian的存储,“01 23 45 67H”在内存里面就是“45H 67H 01H 23H”这样一个顺序。

    此外,还有可以在big-endian与little-endian之间切换的芯片,典型的就是ARM,这样的被叫做bi-endian

    【补充?更正】

    感谢请尽量老兄的纠正――字节(Byte)不一定是8bit构成的,在某些特殊的场合,还可能存在6bit的字节

    详情请参看维基百科的定义

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

    元宝推荐:Highway,

    本帖一共被 2 帖 引用 (帖内工具实现)
    • 家园 在美国读计算机的时候,little-endian到Big-endian的转化就是一个作业。

      当时好像是在Sun Solaris和Dec Unix之间进行的。

      其实这个问题非常简单,使用高级语言的程序员也许从来就没有注意到这还是个问题。比如使用Java,.NET,底层问题早就被Wrapper起来了,who cares!(换平台,从32位到64位,程序员都不需要知道)

      理论上讲,一个设计合理的操作系统这些东西应该是不暴露给广大程序员的,OS以及API/System Call都应该能实现自动切换。当年NT在设计的时候,有个叫做HAL(硬件抽象层)的东西,所有Hardware的差异只出现在这一层,从此往上的操作系统应该是一样的。所以NT很容易的实现了对多个平台的支持(MIPS, PowerPC, Alpha, Intel)。后来这些支持都Drop了,是因为市场太小,没有价值。

      除了写Low-level device driver的程序员,我想这个问题大家都不怎么在乎的。

      PowerPC系统是bi-endian,因为他两种endian都晓得,有趣!

    • 家园 好文。一个小问题,一个字节并不一定是8位。所以也不一定是从0到FF。
分页树展主题 · 全看首页 上页
/ 1
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河