大端与小端,大尾与小尾,高尾端与低尾端,主机字节序与网络字节序

概念剖析

一时记忆与理解大端、小端的概念很容易,但时间一长,对于相似的概念人类的记忆向来是模糊的,甚至是换位的。所以除非你的记忆非常牢靠,否则借助大端和小端这样的名字,你很难将概念与内容联系紧密。

也有文章提到用大尾与小尾的概念,个人觉得这个概念还是没有解决存储概念中的基本问题,大与小还是没有脱离以前的概念,但是引入了尾的概念,已经比大端与小端要更清晰一点。

目前对于记忆大小端,我觉得这篇文章中提到的高尾端/低尾端名词记忆方法比较科学、形象。实话说,当时计算机科学著作翻译Big EndianSmall Endian时,确实没有考虑中国人理解的问题,直译显得生硬,还未做到信达雅的境界。

刚才我们提到存储概念中的基本问题,其实就是两个:一是对于一个数据,如何标示它的头尾;二是头尾在内存中排列的顺序。基于这两个基本问题,我认为高尾端/低尾端这样的叫法是最科学,最贴近存储实情的。其中尾用于表示数据的尾端字节,如int型数据0x1122AABB0xBB即是尾。就更好理解了,指的是存储地址的高低。综合来说就是:

高尾端:数据的尾端字节存储在内存的高地址。即头端字节存储在内存的低地址,数据依序增加存储。 
低尾端:数据的尾端字节存储在内存的低地址。即头端字节存储在内存的高地址,数据依序递减存储。

从这两个概念中,我们可以发现,高尾端存储方式比较符合人类的直观思维方式,地址依序增加,数据依序从头端后移,两者呈完美的顺位对应。而低尾端这种方式很是别扭,显得很反人类。

因此,一般的网络通讯中,我们为了方便人类的习惯,采用高尾端传输方式,也就是大端方式。网络中数据流的传输顺序被称为网络字节序。由此对应一个概念就是主机字节序,也就是数据在主机中存储的方式。因此,在网络传输中,不同的主机有不同的字节序,传输前一定要转换成网络字节序,否则会引起数据传输的错误。


直观理解

上一小节中已经对于各种概念进行了描述,其中相应的关系也给出了,在实际工作中,大家还是习惯性的使用大小端的概念,刚才我也提到了,这种叫法不利于记忆与理解,因此推荐大家使用高尾端/低尾端的概念,两者之前的对应关系还是很明显的,甚至在不需要我说明的情况下,大家凭经验就可以知道高尾端对应大端,低尾端对应小端。

这一节主要细化这两个一一对应的概念,让大家有更直观的感受。

一般来说,计算机内存中都是以字节(Byte)为基本单位,那么对于一个int型数据,它在内存中的存储方式有两种,这就是大端存储小端存储。以上节数据0x1122AABB为例,假设存储在地址为0x91000000的内存处。很显然,它需要占用四个内存地址,从0x91000000-0x91000003

地址 0x91000000 0x91000001 0x91000002 0x91000003
大端 11 22 AA BB
小端 BB AA 22 11

很自然,大家会觉得大端存储方式符合人类的习惯,这种存储方式就是将数据的尾端字节存储在高地址。上面的描述倒是怪怪的。但不论怎么说,高尾端/低尾端方式包含了存储问题中的两个基本要点,只要稍加思维,就可以将概念与内容对应上来。

时间: 2024-10-10 17:02:43

大端与小端,大尾与小尾,高尾端与低尾端,主机字节序与网络字节序的相关文章

主机字节序和网络字节序(大端序,小端序,网络序)

根据cpu的不同我们可以把主机字节序在内存中存储的顺序叫做主机序,也就是我们常说的,大端机和小端机.我们经常看到的有两种: 1.小端机(内存中以小端序存储的机器):将低字节序存储在开始的地址(及内存较小的内存) 2.大端机(内存中以大端序存储的机器):将高字节序存储在开始的的地址 举个例子:我们将内存从左到右排列:在内存中存放0x01020304              2000     2001    2002     2003 小 : 04             03         0

【转】轻松记住大端小端的含义(附对大端和小端的解释)

原文网址:http://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html 或许你曾经仔细了解过什么是大端小端,也动手编写了测试手头上的机器上是大端还是小端的程序,甚至还编写了大端小端转换程序:但过了一段时间之后,当你再看到大端和小端这两个字眼,你的脑中很快浮起了自己曾经做过的工作,却总是想不起究竟哪种是大端.哪种是小端,然后又去查以前写的记录?更让人不快的是,这种经历反反复复,让你十分困扰.如果你和以前的笔者一样,有过这种不快

我如何确定一个机器的字节顺序是大端还是小端?

通常的技巧是使用一个指针: int x = 1; if(*(char *)&x == 1) printf("little-endian\n"); else printf("big-endian\n"); 或者一个union: union { int i; char c[sizeof(int)]; } x; x.i = 1; if(x.c[0] == 1) printf("little-endian\n"); else printf(&qu

变量在内存中的存储方式-----“大端”和“小端”

"大端"和"小端"可以追溯到1726年的Jonathan Swift的<格列佛游记>,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争.1981年10月,Danny Cohen的文章<论圣战以及对和平的祈祷>(On holy wars and a plea for peace)将这一对词语引入了计算机界(<程序设计实践>第9章).这么看来,所谓大端和小端,也就是big-endia

大端小端是什么?如何区分?

    今天我们谈谈计算机中的大端小端以及网络中的大端小端.参考了网上好多资料以后,从众多资料中我也按照自己的理解方式,总结一下. 学习一个新东西:我们依然是先了解一下大端小端的历史: 讲故事 这个就需要求救一下度娘,以下故事来自度娘,真假我也不知道,权当听故事: "大端"和"小端"可以追溯到1726年的Jonathan Swift的<格列佛游记>,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争.19

大端小端数据存储方式

大端:BigEndian 大端模式第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节),高字节在低地址, 低字节在高地址. 小端:LittleEndian  小端模式第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节),高字节在高地址, 低字节在低地址. egg: 从内存地址为0x0000开始有以下数据:0x1234abcd BigEndian: 低地址 --> 高地址 0x0000  0x0001  0x0002  0x0003 0x12

小端字节序与大端字节序

端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序. 小端字节序:低字节存于内存低地址:高字节存于内存高地址.如一个long型数据0x12345678 0x0029f458 0x78 0x0029f459 0x56 0x0029f45a 0x34 0x0029f45b 0x12 在以上数据存放于内存中的表现形式中,0x0029f458 < 0x0029f459 < 0x0029f45a < 0x0029f45b, 可以知道内存的地址是由低到高的顺序:而数据的字节也是由低到高的,

大端小端法

不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址,所不同的是首先取低字节的数据存放在低地址还是取高字节数据存放在低地址. 若首先取高字节的数据存放在低地址,则是大端法 若首先去低字节的数据存放在低地址,则是小端法 即是,高字节(大)在低地址叫大端法,低字节(小)在低地址叫小端法 参考:http://blog.csdn.net/zuyi532/article/details/8020712

大端小端的判断

大端小端的判断 1.联合体(共用体) union U { char s[9]; int n; double d; }; 联合体和结构体的定义和使用是一样的,就不详细的赘述.必须要记住:联合体所有的成员变量都是共享同一块内存的,从相同的起始地址进行赋值.也就是给联合体的一个成员变量赋值的时候,就会改变其他成员变量的值. 联合体的大小: 对于计算一个联合体的大小(共用体)来说,不同的编译器计算的结果是不同的. VS2013: union U { char s[9]; int n; double d;