现在先来理解这对概念,大端和小端这两个令人迷惑的术语究竟是如何产生的?《程序设计实践》第9章中提到,“大端”和“小端”可以追溯到1726年的Jonathan Swift的《格列佛游记》,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争。1981年10月,Danny Cohen的文章《论圣战以及对和平的祈祷》(On holy wars and a plea for peace)将这一对词语引入了计算机界。这么看来,所谓大端和小端,也就是big-endian和little-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;
    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);
}

弄懂大端小端含义


或者程序二:

#include <stdio.h>

 

int main()

{

union

{

int i;

char c;

}u;

u.i = 1;

printf("当前计算机:%s\n",u.c == 1? "小端" : "大端");

return 0;

}


最后举一个生活中例子来类比下;我有一个柜子,柜子底部(低海拔/低地址),柜子底部(高海拔/高地址),现在我要藏一个美女进去,第一种情况我有个正常思想(小端) 把美女脚(低位)朝下、头(高位)朝上放进柜子;第二种情况 我可能被狗咬了,也许是美女自己要求的,原因不重要了(大端) 把美女头(高位)朝下 、脚(低位)朝上放进柜子;不管是怎么放的美女进去,我抱出来时,都能把美女脚朝下头朝上,让她妈认识领回家吃饭(一般情况下写c程序不用关心是大端还是小端,计算机系统会帮我们转换的!);现在某些吃瓜群众也是闲的蛋疼想知道我是思想正常的还是不正常的?(计算机的主机字节序是大端还是小端?或者说系统字节序是大端还是小端?) 这个so easy!  把美女重新让我放进去,然后你们可以从柜子底部打开个洞看是是脚还是头,如果是脚就是正常思想(小端);当然也可以从柜子顶部打开个洞 是头(小端)是脚 非正常思想呀!丧心病狂啊(大端)。


弄懂大端小端含义



相关文章:

  • 2022-02-16
  • 2022-12-23
  • 2022-12-23
  • 2021-05-15
  • 2021-06-16
猜你喜欢
  • 2021-07-15
  • 2021-05-05
  • 2021-04-10
相关资源
相似解决方案