【Linux网络编程】大端模式和小端模式

188人浏览   2024-06-07 15:05:42

01. 概述

大端模式(Big-endian):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端,即正序排列,高尾端;

小端模式(Little-endian):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端,即逆序排列,低尾端;

例(无论是小端模式还是大端模式。每个字节内部都是按顺序排列):

  1. 大端模式:

低地址 -----------------> 高地址

0x0A | 0x0B | 0x0C | 0x0D


  1. 小端模式:

低地址 ------------------> 高地址

0x0D | 0x0C | 0x0B | 0x0A



02. 示例分析

16bit宽的数0x1234在两种模式CPU内存中的存放方式(假设从地址0x2000开始存放)为:

内存地址

小端模式存放内容

大端模式存放内容

0x2000

0x34

0x12

0x2001

0x12

0x34

32bit宽的数0x12345678在两种模式CPU内存中的存放方式(假设从地址0x2000开始存放)为:

内存地址

小端模式存放内容

大端模式存放内容

0x2000

0x78

0x12

0x2001

0x56

0x34

0x2002

0x34

0x56

0x2003

0x12

0x78

03. 优缺点

大端小端没有谁优谁劣,各自优势便是对方劣势:

小端模式 :

强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。


大端模式 :


符号位的判定固定为第一个字节,容易判断正负。

04. 数组存储

大端模式:

高位存储在高地址,低位存储在低地址。

小端模式:

低位存储在低地址,高位存储在高地址。

05. 测试机器模式

测试机器的大小端模式代码

#include <stdio.h>

#include <string.h>


int main(void)

{

short i = 0x1234;


char *p = (char *)&i;


if (0x12 == *p)

{

printf("大端模式\n");

}

else

{

printf("小端模式\n");

}


return 0;

}


一般操作系统都是小端,而通讯协议是大端的。

相关推荐