大小端

前言

大小端(Endianness)是计算机系统表示多字节数据的一种方式,它决定了多字节数据的存储顺序。在计算机系统中,多字节数据(如32位或64位的整数)的存储方式有两种:大端(Big-endian)和小端(Little-endian)。

  • 为什么要区分大小端?

    不同的处理器和操作系统可能采用不同的端序,所以在进行数据交换时(比如网络通信或读取文件),需要知道数据的端序,以确保正确解析数据。

1、大端(Big-endian)

在大端模式下,数据的最高有效字节(即最左边的那一位)会被存储在内存中的最低地址处,而最低有效字节则会被存储在最高地址处。

例如

使用16进制数0x12345678为例,大端模式下的存储方式如下:

地址从低到高:12 34 56 78

在这里插入图片描述

2、小端(Little-endian)

在小端模式下,数据的最低有效字节会被存储在内存中的最低地址处,而最高有效字节则会被存储在最高地址处。

示例

同样以0x12345678为例,小端模式下的存储方式如下:

地址从低到高:78 56 34 12

在这里插入图片描述

3、例子说明

假设我们有一个32位的无符号整数0x12345678,并且我们想将其存储在内存中。

大端存储

在大端系统中,这个数会被存储为:

内存地址:
0x0000: 12
0x0001: 34
0x0002: 56
0x0003: 78

小端存储

而在小端系统中,同样的数会被存储为:

内存地址:
0x0000: 78
0x0001: 56
0x0002: 34
0x0003: 12

4、使用C语言来实现判断大小端

大多数编程语言都提供了检测和处理端序的API。在C语言中,可以使用htonlhtonsntohlntohs等函数来进行主机字节序和网络字节序的转换。

#include <stdio.h>
int main() {
    unsigned int testValue = 0x1;
    char *testPtr = (char*)&testValue;
    if (*testPtr == 0x1) {
        printf("小端模式\n");
    } else {
        printf("大端模式\n");
    }
    return 0;
}
  1. 定义测试值:定义一个无符号整数testValue并初始化为0x1。

  2. 获取指针:将testValue的地址转换为字符指针testPtr。这样做的目的是为了能够访问这个整数的第一个字节。

  3. 检查第一个字节:通过解引用testPtr来检查存储在最低地址处的字节值。

    • 如果系统是小端模式,那么最低有效字节(0x1)会被存储在最低地址处,因此*testPtr的值会是0x1。
    • 如果系统是大端模式,那么最高有效字节会被存储在最低地址处,而最低有效字节会被存储在最高地址处,因此*testPtr的值不会是0x1。

5、通俗了解大小端

大端

正如我们眼见看到一样,在这里以12345678,在大端中就是12345678和我们看到的一致。

大端就像我们眼睛看到其排列方式是 0x12 34 56 78

小端

小端就返回来在我们看到的是12345678但是在小端中的排列方式是反过来,那么这样就变成了78 56 34 12。

大端就像我们眼睛看到其排列方式是 0x78 56 34 12

总结

本章主要介绍了大小端在内存中排列方式,直观的展示了大小端的格式和区别。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐