小端格式和大端格式(Little-EndianBig-Endian)
小端格式和大端格式(Little-Endian&Big-Endian)
1 字节序
字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序。
在几乎所有的机器上,多字节对象都被存储为连续的字节序列。
例如:如果C/C++中的一个int
型变量 a 的起始地址是&a = 0x100
,那么 a 的四个字节将被存储在存储器的0x100
, 0x101
, 0x102
, 0x103
位置。
不同的CPU有不同的字节序类型,最常见的有两种:
Little-Endian:将低序字节存储在起始地址(低位编址)
Big-Endian:将高序字节存储在起始地址(高位编址)
举例说明如下图
然后就牵涉出两大CPU派系:
- Motorola 6800,PowerPC 970,SPARC(除V9外)等处理器采用Big-Endian方式存储数据;
- x86系列,VAX,PDP-11等处理器采用Little0Endian方式存储数据。
- 另外,还有一些处理器像ARM, DEC Alpha的字节序是可配置的。
2 LE(Little-Endian)
最符合人的思维的字节序
地址低位存储值的低位,地址高位存储值的高位。
因为从人的第一观感来说,低位值小,就应该放在内存地址小的地方,也即内存地址低位。反之,高位值就应该放在内存地址大的地方,也即内存地址高位。所以说是最符合人的思维的字节序。
就好比我们从小学的计数法,个位代表的单位值最小,放在最低位,以此类推十位,百位。
优势:长度为1,2,4字节的数,排列方式都是一样的,数据类型转换非常方便。
举个例子:在内存中双字0x01020304
(DWORD)和0x1234abcd
的存储方式。
内存地址 | 4000 | 4001 | 4002 | 4003 |
---|---|---|---|---|
LE | 04 | 03 | 02 | 01 |
LE | 0xcd | 0xab | 0x34 | 0x12 |
注:每个地址存1个字节,每个字有4个字节。2位16进制数是1个字节(0xFF=11111111)。
3 BE(Big-Endian)
最直观的字节序
地址低位存储值的高位,地址高位存储值的低位,
只需要把内存地址从左到右按照由低到高的顺序写出,也就是把值按照通常的高位到低位的顺序写出,一个字节一个字节的填充进去即可,直接阅读从低到高的地址里面的数据即可。
举个例子:在内存中双字0x01020304
(DWORD)和0x1234abcd
的存储方式。
内存地址 | 4000 | 4001 | 4002 | 4003 |
---|---|---|---|---|
BE | 0x01 | 0x02 | 0x03 | 0x04 |
BE | 0x12 | 0x23 | 0xab | 0xcd |
注:每个地址存1个字节,每个字有4个字节。2位16进制数是1个字节(0xFF=11111111)。
4 为什么要注意字节序
如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。
但是,如果你的程序要跟别人的程序产生交互呢? 比如,当一个 C/C++ 的程序要与一个 Java 程序交互时:
- C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而现在比较普遍的 x86 处理器是 Little Endian
- JAVA编写的程序则唯一采用 Big Endian 方式来存储数据
试想,如果你的C/C++程序将变量 a = 0x12345678
的首地址传递给了Java程序,由于Java采取 Big Endian 方式存储数据,很自然的它会将你的数据翻译为 0x78563412
。显然,问题就出现了!!!
另外,网络传输一般采用 Big Endian,也被称之为网络字节序,或网络序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。
5 判断机器的字节序
由于 C/C++ 存储数据时的字节序依赖所在平台的CPU,所以我们可以通过C/C++程序判定机器的端序:
void Endianness()
{int a = 0x12345678;if( *((char*)&a) == 0x12)cout << "Big Endian" << endl;elsecout << "Little Endian" << endl;
}
参考文献
小端格式和大端格式(Little-Endian&Big-Endian) - 清风行云 - 博客园
字节序:Big Endian 和 Little Endian | 神奕的博客
小端格式和大端格式(Little-EndianBig-Endian)相关推荐
- linux 是大端还是小端,详解大端模式和小端模式
七.如何进行转换 对于字数据(16位): #define BigtoLittle16(A) (( ((uint16)(A) & 0xff00) >> 8) | \ (( ( ...
- 小端模式和大端模式的区别与C++代码检测
序言:当同一台主机上的两个进程(一个由c语言编写,另一个由Java编写)通信或者两台使用不同字节序的主机之间传送数据时,若字节序不同,则发送的数据和接受的数据不一样.因此需要进行小端字节序(小端模式) ...
- 小端模式和大端模式_计算机字节顺序(大端法和小端法)详解
首先理清一下基本的概念: 1. 大多数机器使用时的8位的块(一个字节),作为可寻址的最小单位, 2. 机器级程序将内存视为非常大的字节数组(虚拟内存),内存的每个字节都由一个唯一的数字来表示(如下X的 ...
- 小端法、大端法、网络字节转序
1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端. 2.大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起 ...
- matlab小端模式合并,大端方式和小端模式【YC】
大端模式和小端模式[YC] 小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址. 大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址. 下 ...
- 小端模式和大端模式_大端序和小端序
字节存储顺序主要分为大端序(Big-endian)和小端序(Little-endian),区别如下 Big-endian:高位字节存入低地址,低位字节存入高地址 Little-endian:低位字节存 ...
- C语言--小端模式和大端模式
一.概念: 大端(存储)模式:是指一个数据的低位字节的内容存放在高地址处,高位字节的内容存放在低地址处. 小端(存储)模式:是指一个数据的低位字节的内容存放在低地址处,高位字节的内容存 ...
- 如何判断小端模式和大端模式
用指针判断大小端 #include<stdio.h> int main(void) {int a = 1;char b = (*(char *)(&a));if(1 == b){p ...
- 数据存储:小端模式和大端模式——终于搞明白了!!!
首先要记住:读数据永远是从低地址开始的!!! 正文开始 什么是低地址.高地址? 地址编号小的是低地址,地址编号大的是高地址 什么是数据的低位.高位? 小端模式 数据的低位放在低地址空间,数据的高位放在 ...
- socket 大端 小端 转换 (转)《二》
http://blog.csdn.net/kukumouse/article/details/2270356 (1)对于位域结构中的变量来说,其长度不能跨越字节,也就是说不能超过8位.当然如果设置空白 ...
最新文章
- MySQL基础day03_数据的导入、导出-MySQL 5.6
- Logistic Regression逻辑回归
- testNg自动化,读取excel的数据
- olr 性能调优 NO_NORMS
- python字频统计软件_python结巴分词以及词频统计实例
- python中set函数作用如何自己用代码实现_Python进阶开发之元类编程
- 在 Perl 中使用 Getopt::Long 模块来接收用户命令行参数
- python安装包,使用镜像安装
- 计算机旅游网站论文,设计一个旅游网站 计算机专业毕业论文.doc
- Python基础之文件读写和列表字典使用 ——《侠客行》文本分析
- 阿里有centos7 安装MongoDB及win7下MongoChef的安装
- 手机如何双声道录音_如何在手机端实现电话录音功能?
- 转载标明出处用英语_转载怎么注明出处
- 关于 COPY 导入数据的问题
- 微信地图wgs84坐标,gcj02坐标,bd09坐标转换
- 学习AI人工智能,你必须要知道的4件事!
- 【每周一读】——你的孤独,虽败犹荣
- 程序员在论坛里炫耀公司待遇,一线互联网公司员工直接晒出下午茶
- 在iframe中写html,使用jQuery在iframe中获取HTML
- leetcode必刷题(四)lee75 颜色分类、lee76 最小覆盖字串、lee78 子集、lee79 单词搜索、lee84 柱状图中最大的矩形、lee85 最大矩形、lee96 不同的二叉搜索树、