数据结构中,关于“大小端”的数据存储方式的相关问题
2012-07-20 09:52
330 查看
字节序(Endian),大端(Big-Endian),小端(Little-Endian)
转载自:http://www.cppblog.com/tx7do/archive/2009/01/06/71276.html在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:
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) |
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。
引用
1. 关于Endian大小端模式:
http://hi.baidu.com/%C8%FD%C9%EE/blog/item/6abb3d7779c0961db151b96b.html
2. Endianness:
http://en.wikipedia.org/wiki/Endianness
posted on 2009-01-06 03:44 杨粼波 阅读(5523)评论(1) 编辑 收藏引用
相关文章推荐
- 数据结构中,关于“大小端”的数据存储方式的相关问题
- 关于大小端存储方式问题的思考
- 【C++知识点】关于32位数字小端方式存储的问题
- 关于STM32栈增长和大端/小端问题是和CPU相关的两个问题
- 了解关于Android内存泄露等相关问题的处理方式
- python相关的几种数据类型的存储读取方式
- 关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题
- 数据结构之图的两种存储方式
- 关于文件、网络传输以及内存存储的大小端问题
- 关于数据存储的问题总结
- Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)
- 关于UEditor插件的使用以及UEditor数据回显问题,数据库存储标签代码前台页面如何解析问题小结
- 【数据结构】图的存储方式:邻接矩阵和邻接表
- 关于list中存储map数据重复问题
- 数据在内存中如何存储?静态存储区 栈区 堆区 小端和大端存储方式
- 关于Spring Data Redis存储时key value数据的乱码问题
- Java中基本数据类型的存储方式和相关内存的处理方式
- 关于在asp.net中使用showDialogModal方式输入数据中存在的问题
- C程序判断你主机的数据存储方式(大端和小端)
- 关于VB中数据的存储格式和寻址方式