详解大小端

关于计算机界的大小端问题有著名的CPU两大派系,PowerPC系列采用大端(big endian)的方式存储数据,而X86系列则采用小端(little endian)方式存储数据。很显然如果你的程序只运行在PowerPC系列的CPU上,你完全可以不管什么是little endian,但是如果你PowerPC上的程序要和X86上的程序打交道,那么你就必须进行转换才能相互识别,

我们又该怎样去理解它呢?

  1. 我们应该知道数据在计算机中是以二进制形式存储的,1个字节有8位,每1位的值只能是0或者1;
  2. 我们还知道一个4位的二进制数和1位的十六进制数是1-1对应的,那么1个字节就可以拆分成2位的十六进制数;
  3. 我们还应该知道像0x1234abcd这样一个16进制数在内存中它是以4个字节存储的,既然这个数据在内存中跨越了多个字节,那么它肯定是有顺序的,我们叫它字节序。【一般操作系统都是小端,而通讯协议是大端的】
  4. 这里的端指的是数据的尾端,大指的是高内存地址,小指的是低内存地址

一般人的书写习惯:

  • 数据左边的为高位,右边的为低位,
  • 地址则相反:地址左边的为低位,右边的为高位

例如: 数据16位数据:0x12345678,12为数据的高位,78位数据的低位

大端模式:

数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

例如:四字节的数据:0x12345678,
地址:低->高,低地址存放高位,高地址存放低位

存储为:
在这里插入图片描述

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

例如:四字节的数据0x12345678,
地址:低->高,高地址存放高位,低地址存放低位

存储为:
在这里插入图片描述

只需记住与我们阅读习惯一致的为大端模式。

  • 大端:把高位存储到低地址里面,把低位存储到高地址里面
  • 小端:把低位存储到低地址里面,把高位存储到高地址里面

CPU是大端还是小段,可使用代码来进行测试:

详解大小端_第1张图片
详解大小端_第2张图片

#include 

//小端模式:LITTLE
//大端模式:BIG
int main()
{
    int a = 1;
    char pc = *(char*)(&a);
    if (pc == 1)
        printf("LITTLE\n");
    else
        printf("BIG\n");

    return 0;
}
  • 分配空间地址先分配高地址再分配低地址
  • 较低的存储器地址,较低的有效字节存储在较高的存储器地址。
大端与小端的优势

二者无所谓优势,无所谓劣势,各自优势便是对方劣势
大端模式:符号位的判定固定为第一个字节,容易判断正负。
小端模式:强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样

数组在大端小端情况下的存储:
以unsigned int value = 0x12345678为例,
分别看看在两种字节序下其存储情况,
我们可以用unsigned char buf[4]来表示value:
Big-Endian: 低地址存放高位,如下:
高地址
---------------
buf[3] (0x78) – 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) – 高位
---------------
低地址
Little-Endian: 低地址存放低位,如下:
高地址
---------------
buf[3] (0x12) – 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) – 低位
--------------
低地址

示例:

1.
temp=0X12345678;

低地址---------->高地址【大端模式】:
0X12|0X34|0X56|0X78|
低地址---------->高地址【小端模式】:
0X78|0X56|0X34|0X12|

2.
假设变量x类型为int,位于地址0x100处,它的十六进制为0x01234567,地址范围为0x100~0x103字节,其内部排列顺序依赖于机器的类型。
大端法从首位开始是:0x100: 01, 0x101: 23, 0x102: 45, 0x103: 67
小端法从首位开始是:0x100: 67, 0x101: 45, 0x102: 23, 0x103: 01

你可能感兴趣的:(C语言,C++专栏)