什么是大端? 什么是小端?

在搞明白大小端之前,先看2个概念,高低字节高低地址

高低字节

image-20220105120910483

高低字节类似于数字表示的位数,如果把unsigned int看成是千位的话,从左到右依次千位,百位,十位,个位,左高右低。

  • 对于一个字节的数据(char/unsigned char/bool)而言,没有高低字节之分。
  • 只有大于一个字节以上的数据才要区分高低字节。

高低地址

image-20220105135527049

  • 计算机的基本存储单位是字节(byte),1byte = 8bit,从00000000到11111111表示的范围是[0,255]。
  • 对于内存中的每一个字节(byte),都有一个索引编号,就是指针,也即地址,索引是从0开始,从左到右依次增大,所以左边被称为低地址,右边被称为高地址。

大端,小端

盗用维基百科上的2张图来解释下大小端。

大端
大端

根据大端的定义:数据的高字节保存在内存的低地址中,数据的低字节保存在内存的高地址中。

小端

根据小端的定义:数据的低字节保存在内存的低地址中,数据的高字节保存在内存的高地址中。

比如十六进制数0xDC6E35FF,从左到右依次是高字节到低字节,因为从左到右同时是由低地址到高地址,如果按照小端存储,则0xDC6E35FF在内存中对应存储为0xFF356EDC,如果按照大端存储,则应该是0xDC6E35FF

如何判断大端还是小端

python查看:

1
python -c "import sys; print(sys.byteorder)"

c查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main() {
int i = 0x11223344;
char *p;

p = (char *) &i;
if (*p == 0x44) {
printf("Little endian\n");
}
else {
printf("Big endian\n");
}
return 0;
}

参考链接: