天天看点

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

00. 目录

文章目录

    • 00. 目录
    • 01. 概述
    • 02. 示例分析
    • 03. 优缺点
    • 04. 数组存储
    • 05. 测试机器模式
    • 07. 附录

01. 概述

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

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

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

  1. 大端模式:

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

0x0A | 0x0B | 0x0C | 0x0D

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

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

0x0D | 0x0C | 0x0B | 0x0A

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

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;
}
           

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

07. 附录

上一篇: glib入门