学习记录之大端存储和小端存储

大端存储和小端存储

在计算机系统中,数据在内存中的存储方式并不是唯一的。对于多字节的数据类型(如 intfloat 等),计算机可以以不同的方式在内存中存储它们。这些存储方式通常分为两种:大端存储(Big-Endian)和小端存储(Little-Endian)。了解这两种存储方式对底层编程和系统开发非常重要,尤其在涉及数据传输或跨平台开发时。本文将详细解释大端存储与小端存储。

什么是大端存储,什么是小端存储

我们从最开始的汇编语言就可以知道,数据与程序在内存里面以二进制的形式进行存储,而它们进行存储的时候我们可以知道它以什么作为单位,比如就拿我最近学的8086CPU作为例子,它可以一次性处理以下的两种尺寸的数据。

1.字节:一个字节由8个bit组成,可以存在8位寄存器中。

2.字:一个字由两个字节组成,在一个字中我们可以分成高位字节和低位字节,如下图。

在这里插入图片描述

接下来我们就来说一下什么是大端存储什么是小端存储了。

当一个多字节的数据(例如 32 位整数)被存储在内存中时,需要决定这些字节的存储顺序。

  • 大端存储(Big-Endian):数据的最高有效字节(Most Significant Byte,MSB)存储在内存的最低地址。换句话说,数值中权重最大的字节在内存中最前面。
  • 小端存储(Little-Endian):数据的最低有效字节(Least Significant Byte,LSB)存储在内存的最低地址。换句话说,数值中权重最小的字节在内存中最前面。

这里我们来解释一下里面的一些名词。

最高地址(High Address):指的是内存中地址值较大的位置。在内存的连续地址空间中,最高地址位于末尾。

最低地址(Low Address):指的是内存中地址值较小的位置。在内存的连续地址空间中,最低地址位于开始端。

最高有效字节(Most Significant Byte,MSB):可以把它看作上面16位时的高位字节。

最低有效字节(Least Significant Byte,LSB):可以把它看作上面16位的低位字节。

我们这里举个例子来说明一下,比如一个32位无符号0x12345678,它占用了四个字节

按照大端存储来看的话,内存从低地址到高地址是:0x12 0x34 0x56 0x78,高位字节0x12存储在低地址

而按照小端存储来看的话,内存从低地址到高地址的存储顺序为:0x78 0x56 0x34 0x12,高位字节0x12存储在最高地址。

大端和小端存储的优势

大端存储的优势

1.**符合人类的阅读习惯。**例如,在处理多字节数据时,直接读取的字节顺序与我们书写和阅读数字的顺序相同。这对于调试和手动分析内存内容时更为直观。

2.**网络协议一致性。**许多网络协议(如 TCP/IP)采用大端字节序。这使得在网络传输数据时,无需转换字节序,减少了潜在的兼容性问题,确保了在不同平台间的数据一致性。

3.**方便与数据结构结合。**某些数据结构(如某些图像格式、音频格式)在设计时可能采用大端存储,这使得直接读取和处理这些格式的数据时更加高效。

小端存储的优势

1.**处理效率高。**在小端存储中,低位字节存储在内存的低地址,对于一些基本的加法和运算操作,特别是在处理低位字节时,可以直接从内存中读取,不需要额外的字节序转换。这在某些情况下可以提高处理效率。

2.**硬件支持小端存储。**许多现代处理器(如 Intel 和 AMD)采用小端字节序,这使得在这些平台上开发的软件不需要进行字节序转换,能够更高效地访问和处理数据。

3.**与编程语言兼容。**一些编程语言(如 C/C++)在处理数组和指针时,可能更容易与小端存储兼容,尤其是在涉及到位操作时。

在计算机里如何检测系统是大端还是小端

在这里我们用一个简单的C语言程序来进行判断。

#include <stdio.h>
#include <stdlib.h>
int main()
{
	unsigned int x = 0x12345678;
	unsigned char* p = (unsigned char*)(&x);
	if (*p == 0x78)
	{
		printf("小端存储");
	}
	else
	{
		printf("大端存储");
	}
	return 0;
}

注意:这里的unsigned char可以用来当作一个字节所存储的内容,而不只是单纯的无符号的字符类型。

我们通过这段代码可以很轻松的得到最终的结果。

反思

unsigned char可以用来当作一个字节所存储的内容,而不只是单纯的无符号的字符类型。

我们通过这段代码可以很轻松的得到最终的结果。

反思

掌握大端存储和小端存储的概念,有助于我们在开发过程中更准确地处理数据,以及对于计算机内存有一定的了解,对于认识整个计算机体系也有一定的帮助。

### 大端模式与小端模式的区别 大端模式(Big-Endian)小端模式(Little-Endian)是计算机存储多字节数据时使用的两种不同字节序方式,其核心差异在于多字节数据的高位字节低位字节在内存中的排列顺序。 #### 存储顺序对比 - **大端模式**:高位字节存放在低地址处,而低位字节存放在高地址处。这意味着,在读取数据时,最先访问的是最高有效位[^1]。 - **小端模式**:低位字节存放在低地址处,而高位字节存放在高地址处。因此,当读取数据时,最先访问的是最低有效位[^3]。 这种差异直接影响了程序如何解释内存中的二进制序列以及跨平台通信的数据一致性。 --- ### 应用场景分析 #### 1. 网络通信领域 在网络通信中,为了确保不同架构设备之间的兼容性一致性,通常会采用统一的标准——即网络字节序。 - 网络字节序实际上是指大端字节序[^2]。这是因为许多早期设计的网络协议都基于大端模式实现,从而形成了行业惯例。 - 如果某些系统的本机字节序为小端,则需要通过特定函数(如 `htonl` `ntohl`)完成转换操作以适配网络传输需求。 #### 2. 嵌入式开发环境 嵌入式系统可能运行于各种处理器上,这些处理器支持不同的默认字节序配置: - ARM 架构可以灵活切换大小端; - Intel x86 则普遍遵循小端规则; 开发者需清楚目标硬件的工作机制并编写相应代码来管理内部运算结果同外部接口间潜在冲突情况下的调整逻辑。 #### 3. 文件格式解析 一些文件标准明确规定了自己的字节序偏好以便被广泛解读利用。例如 PDF 文档规定使用大端表示法记录长度字段等重要元信息项; 而 Windows BMP 图像头部结构倾向于运用小端编码方案描述像素宽度高度属性值等等实例均体现了这一点的重要性所在. --- 以下是用于检测当前机器所采用之字节序的一个简单 Python 实现例子: ```python def check_endian(): import sys if sys.byteorder == 'big': return "The system uses Big-Endian." elif sys.byteorder == 'little': return "The system uses Little-Endian." print(check_endian()) ``` 此脚本能帮助快速判断本地环境中 CPU 的基本特性之一 —— 字节排序习惯。 --- ### 总结说明 无论是软件还是硬件层面的设计考量都会涉及到对于这两种字节序的选择权衡过程。理解它们之间存在的本质差别及其各自适用范围有助于构建更加健壮可靠的计算解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值