轻松记住⼤端⼩端的含义(附对⼤端和⼩端的解释)
  或许你曾经仔细了解过什么是⼤端⼩端,也动⼿编写了测试⼿头上的机器上是⼤端还是⼩端的程序,甚⾄还编写了⼤端⼩端转换程序;但过了⼀段时间之后,当你再看到⼤端和⼩端这两个字眼,你的脑中很快浮起了⾃⼰曾经做过的⼯作,却总是想不起究竟哪种是⼤端、哪种是⼩端,然后⼜去查以前写的记录?更让⼈不快的是,这种经历反反复复,让你⼗分困扰。如果你和以前的笔者⼀样,有过这种不快的经历,那么这篇⽂章希望能帮你彻底解决这个苦恼,让你彻底记住它们。 
  如果你在⼯作中经常使⽤到⼤端和⼩端以⾄于对它们⼗分熟悉,或者你的记忆⼒在保持时间的长度和精准度上都⼗分优秀,以⾄于不需要借助其他的⽅法,那么这篇⽂章不适合你。
  如果你在看这篇⽂章前完全不知道什么是⼤端和⼩端,那么可以参考本⽂的附录或者其他的博⽂,相关的介绍⾮常之多,⽽附录提供了⼀个很常见解释和⼀段测试程序,然后再来看正⽂。
  为了帮助记忆,理解是必要的;⽽记忆的⽬的,也就是为什么要记住它,是更重要的。或许你会问,先了解概念,⽤的时候再查,不⾏么?其实我之前也是这么认为的。⼤端和⼩端这两个名词,你会在很多有关⽹络编程、系统设计、甚⾄是代码写作的书上看到,⽽且它也是很多公司的笔试题、⾯试题热门内容,可见它在⼀些领域是很常⽤。如果等到你⽤的时候再查,⼀⽅⾯要降低你的⼯作效率,另⼀⽅⾯,应试的时候也不是你想查就能查的;其实最主要的是,在掌握规律后,记住它们并不困难。
  现在先来理解这对概念,⼤端和⼩端这两个令⼈迷惑的术语究竟是如何产⽣的?《程序设计实践》第9章中提到,“⼤端”和“⼩端”可以追溯到1726年的Jonathan Swift的《格列佛游记》,其中⼀篇讲到有两个国家因为吃鸡蛋究竟是先打破较⼤的⼀端还是先打破较⼩的⼀端⽽争执不休,甚⾄爆发了战争。1981年10⽉,Danny Cohen的⽂章《论圣战以及对和平的祈祷》(On holy wars and a plea for peace)将这⼀对词语引⼊了计算机界。这么看来,所谓⼤端和⼩端,也就是big-endian和little-endian,其实是从描述鸡蛋的部位⽽引申到计算机地址的描述,也可以说,是从⼀个俚语衍化来的计算机术语。稍有些英语常识的⼈都会知道,如果单靠字⾯意思来理解俚语,那是很难猜到它的正确含义的。在计算机⾥,对于地址的描述,很少⽤“⼤”和“⼩”来形容;对应地,⽤的更多的是“⾼”和“低”;很不幸地,这对术语直接按字⾯翻译过来就成了“⼤端”和“⼩端”,让⼈产⽣迷惑也不是很奇怪的事了。
  不过给我启发的是,在裘宗燕翻译的《程序设计实践》⾥,这对术语并没有翻译为“⼤端”和⼩端,⽽是“⾼尾端”和“低尾端”,这就好理解了:如果把⼀个数看成⼀个字符串,⽐如11223344看成"11223344",末尾是个'\0','11'到'44'个占⽤⼀个存储单元,那么它的尾端很显然是44,前⾯的⾼还是低就表⽰尾端放在⾼地址还是低地址,它在内存中的放法⾮常直观,如下图:
  “⾼/低尾端”⽐“⼤/⼩端”更不容易让⼈迷惑。但是根据个⼈经验,在市⾯上的书籍、⽹络上的各种资料中,很遗憾,前者已经很少见了,多见的是后者。好在这两对形容词中,恰好“⾼”和“⼤”对应,“低”和“⼩”对应;既然⾼尾端对应的是⼤端,低尾端对应的是⼩端,那么当你再见到⼤端和⼩端这⼀对术语,就可以在脑中把它们转化成⾼尾端和低尾端,这时凭着之前的理解,甚⾄不⽤回忆,想着⾼低的字⾯含义就能回想起它们的含义。但是很奇怪的是,同样是裘宗燕翻译的《编程原本》(Elements of Programming),却把big-endian翻译成⼤尾格式(第⼀章)。
  理解之后,总结⼀下,记忆的⽅法是:
    (数据看成字符串)⼤端——⾼尾端,⼩端——低尾端
  稍⼀思索什么是“⾼”、什么是"低","尾端"⼜是什么,问题迎刃⽽解,再不⽤担⼼被“⼤端”和“⼩端”迷惑。⽤这种⽅式,是时候放弃原先的死记硬背和容易把⾃⼰绕进去⽽发⽣迷惑的理解了。
附录:什么是“⼤端”和“⼩端”及⼀段测试本机⼤端还是⼩端的代码
  (这段⽂字是《UNIX⽹络编程·卷⼀》的关于这个概念的概括;不仅限于这本书,很多计算机书籍都是这么介绍这个概念的,你会在和计算机相关不同领域的书中遇到它们。尽管很令⼈疑惑,但是在阅读正⽂前,你最好对这两个词语的概念有所理解。当然,如果你以前向正⽂中描述的⼀样接触过它们,那就不必读这⼀部分了。读完后你会发现,你虽然理解了含义,但很容易忘掉,这时你就可以看正⽂部分了)
  对于⼀个由2个字节组成的16位整数,在内存中存储这两个字节有两种⽅法:⼀种是将低序字节存储在起始地址,这称为⼩端(little-endian)字节序;另⼀种⽅法是将⾼序字节存储在起始地址,这称为⼤端(big-endian)字节序。
  在图中,顶部表明内存地址增长⽅向从右到左,在底部标明内存地址增长的⽅向为从左到右。并且还标明最⾼有效位(most significant bit,MSB)是这个16位值最左边⼀位,最低有效位(least significant bit,
LSB)是这个16位值最右边⼀位。术语“⼩端”和“⼤端”表⽰多个字节值的哪⼀端(⼩端或⼤端)存储在该值的起始地址。
  这两种字节序没有标准可循,都有系统在使⽤。把某个给定系统所⽤的字节序称为主机字节序,可以⽤以下程序输出主机字节序。⽅法是在⼀个短整数变量中存放2字节的值0x0102,然后查看它的连续字节c[0](对应上图地址A)和c[1](对应上图地址A+1),以此确定字节序。
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
手机unknown是什么意思if(sizeof(short)==2) {
if(un.c[0]==1 && un.c[1] == 2)
printf("big-endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
} else
printf("sizeof(short)= %d\n",sizeof(short));
exit(0);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。