字节序(Endian),大端(Big-Endian),小端(Little-Endian)
在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:
big-edian和little-endian。
字节顺序 Endian
现代的计算机系统一般采用字节(Octet, 8 bit Byte)作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分字节顺序(Byte Order, orEndianness)。常见的字节顺序有两种:Big Endian(High-byte first)和Little Endian(Low-byte first),这就是表2.1中的BE和LE。Intel X86平台采用Little Endian,而PowerPC处理器则采用了Big Endian。举例来说,整型数字$1234ABCD存储的时候就会有两种方式:
字节顺序 |
内存数据 |
备注 |
Big Endian (BE) |
0xAB 0xCD 0x12 0x34 |
此时的0xAB被称为most significant byte (MSB) |
Little Endian (LE) |
0xCD 0xAB 0x34 0x12 |
此时的0xCD被称为least significant byte (LSB) |
词源:据Jargon File记载,endian这个词来源于Jonathan Swift在1726年写的讽刺小说 "Gulliver's Travels"(《格利佛游记》)。该小说在描述Gulliver畅游小人国时碰到了如下的一个场景。在小人国里的小人因为非常小(身高6英寸)所以总是碰到一些意想不到的问题。有一次因为对水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开的争论而引发了一场战争,并形成了两支截然对立的队伍:支持从Big-End剥开的人Swift就称作Big-Endians而支持从Little-End剥开的人就称作Little-Endians……(后缀ian表明的就是支持某种观点的人:-)。Endian这个词由此而来。
1980年,Danny Cohen在其著名的论文"On Holy Wars and a Plea for Peace"中为了平息一场关于在消息中字节该以什么样的顺序进行传送的争论而引用了该词。该文中,Cohen非常形象贴切地把支持从一个消息序列的MSB开始传送的那伙人叫做Big-Endians,支持从LSB开始传送的相对应地叫做Little-Endians。此后Endian这个词便随着这篇论文而被广为采用。
Mapping registers to memory locations
最高有效位 MSB: Most Significant Bit
最高有效位(MSB),有时候叫做最左边的位,是在一个n位二进制数字中的n-1位,这个位有最高的权重(2^(n-1))。第一个或最左边的位,当这个数字被用一般的方式书写时。
最低有效位 LSB: Least Significant Bit
最低有效位(LSB)是给这些单元值的一个二进制整数位位置,就是,决定是否这个数字是偶数或奇数。LSB有时候是指最右边的位,因为写较不重要的数字到右边位置符号的协定。它类似于一个十进制整数的最不重要的数字,它是在一个(最右边)位置的数字。
大端Big-Endian
低地址存放最高有效位(MSB),既高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最高有效位(MSB)存放在最低端的地址上。采用这种机制的处理器有IBM3700系列、PDP-10、Mortolora微处理器系列和绝大多数的RISC处理器。
小端Little-Endian
低地址存放最低有效位(LSB),既低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最不重要字节(LSB)存放在最低端的地址上。采用这种机制的处理器有PDP-11、VAX、Intel系列微处理器和一些网络通信设备。该术语除了描述多字节存储顺序外还常常用来描述一个字节中各个比特的排放次序。
中端 Middle-Endian
除了big-endian和little-endian之外的多字节存储顺序就是middle-endian,比如以4个字节为例:象以3-4-1-2或者2-1-4-3这样的顺序存储的就是middle-endian。这种存储顺序偶尔会在一些小型机体系中的十进制数的压缩格式中出现。
网络字节序 Network Order
TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
主机序 Host Orader
它遵循Little-Endian规则。所以当两台主机之间要通过TCP/IP协议进行通信的时候就需要调用相应的函数进行主机序(Little-Endian)和网络序(Big-Endian)的转换。
C++怎样判别大端小端
使用宏的方法:
const int endian = 1;
#define is_bigendian() ( (*(char*) &endian) == 0 )
#define is_littlendbian() ( (*(char*) &endian) == 1 )
方法二:
bool IsLittleEndian()
{
union
{
long val;
char Char[sizeof(long)];
}u;
// 1-小端(Intel); 0-大端(Motor)
u.val = 1;
if ( u.Char[0] == 1 )
{
// 小端
return true;
}
else if ( u.Char[sizeof(long)-1] == 1 )
{
// 大端
return false;
}
throw( "Unknown!" );
}
小知识
Java使用的是Big-Endian。
原文地址: http://www.cppblog.com/tx7do/archive/2009/01/06/71276.html
字节序(Endian),大端(Big-Endian),小端(Little-Endian)相关推荐
- 【字节序】大端模式和小端模式
字节高低位 一般左边为高,右边为低,即按照阅读顺序从高到低. 一个32位的数据,0x12345678,高位字节为0x12,低位字节为0x78. 大小端 大端模式 (Big-Endian) :高字节放低 ...
- 字节顺序:大端模式 和 小端模式
字节顺序有"大端模式" 和 "小端模式" 两种. 一.字节顺序只是对内置数据类型而言. 例如对于一整型(int,int 是内置数据类型)数,比如 0x12345 ...
- 字节序是什么?(大小端 Big endian Little endian)
字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前. 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序. 常见序: Little endian: 将 ...
- 大端模式与小端模式的详解分析
大端序与小端序 何为大端序,小端序? 简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了.注意字节序是硬件层面 ...
- 嵌入式基础01【转载】详解大端模式和小端模式
---------------- 版权声明:本文为CSDN博主「ce123」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog. ...
- 详解大端模式和小端模式【转】
详解大端模式和小端模式 一.大端模式和小端模式的起源 本文转载自:http://blog.csdn.net/ce123/article/details/6971544 关于大端小端名词的由来,有一个有 ...
- 字节序、大端字节序(Big Endian)、小端字节序(Little Endian)总结
什么是字节序? 字节序,简单来说,指的是 超过一个字节的数据类型在内存中存储的顺序 有几种字节序? 大端字节序(Big Endian) 高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处. ...
- 大端(Big Endian)与小端(Little Endian)详解
大端(Big Endian)与小端(Little Endian)简介 /// 1. 你从哪里来? 端模式(Endian)的这个词出自JonathanSwift书写的<格列佛游记>.这本书根 ...
- linux网络编程之网络字节序、主机字节序、大端、小端
1.主机字节序介绍 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机字节序,存储方式有2种 1).大端模式 大端模式(Big-Endian)就是高位字节排放在内存的低 ...
- 2007-11-22 21:24 大端(Big Endian)与小端(Little Endian)详解
[大端(Big Endian)与小端(Little Endian)简介] Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte Order. 对于数据中跨越 ...
最新文章
- etw系统provider事件较多_【Flutter 实战】文件系统目录
- Matlab图像处理创新实践-实验2【图像滤波基础(2)】
- GDCM:gdcm::ImageChangePlanarConfiguration的测试程序
- C++Pascal‘s Triangle杨辉三角的实现算法
- 可能是世界上最简单的用 Go 来写 WebAssembly 的教程
- 肺癌图片识别的相关信息
- Docker 实战教程之从入门到提高 (五)
- bzoj1051: [HAOI2006]受欢迎的牛
- java 分裂数字_分裂的补充:超越数字,打印物理可视化
- MATLAB电压不平衡,电力系统不对称故障计算的Matlab算法程序
- 《计算机网络》第四章:介质访问控制(The Medium Access Control Sublayer)
- java怎么对用户做自定义模版打印_Printing tools 自定义模板打印的实现
- UNIX编程艺术学习笔记-1
- 【lnmp一键安装包】LNMP一键安装和配置(解决LNMP502和500问题)
- 谷歌地图api根据经纬度查询地名php,在线查询经纬度 google map查询地名返回经纬度 geocode geocoder的完整实例 代码下载...
- 【雅思单词】【绿皮书】雅思单词-错词-第三遍
- PNAS:植物香豆素塑造拟南芥合成根系微生物组的组成
- 改善网页性能的5种方法
- 手把手带你撸一个校园APP(一):项目简介
- 高等数学强化3:一元函数积分学 P积分