0%

字节序大小端

有些人闯进你的生活,只是为了给你上一课,然后转身离开。

一、概念

      计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian),大部分计算机都是大端序。

  1. 大端字节序:高位字节在前,低位字节在后(这是人类读写数值的习惯)。
  2. 小端字节序:低位字节在前,高位字节在后。

举例来说,对于数值0x1234,高位字节是0x12,低位字节是0x34

使用大端模式存储如下:

1
2
3
内存低地址 ————————————————————> 内存高地址
... | 0x12 | 0x34 | ...
... a a+1 ...

使用小端模式存储如下:

1
2
3
内存低地址 ————————————————————> 内存高地址
... | 0x34 | 0x12 | ...
... a a+1 ...

二、判断大小端

  1. union方式
    • 联合体类型数据所占的内存空间等于其最大的成员所占的空间,对联合体内部所有成员的存取都是相对于该联合体基地址的偏移量为0处开始
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main()
{
union{
int a;
char b;
} data;

data.a = 1;

// 在联合体data所占内存中,b所占内存等于a所占内存的低地址部分
if (1 == data.b) {
printf("小端模式");
} else {
printf("大端模式");
}

return 0;
}
  • 对联合体成员a赋值1,十六进制为0x00000001,其中1为数据的低字节位
    • 如果1被存储在data所占内存的低地址中,那data.b的值将会是1,就是小端模式。
    • 如果1被存储在data所占内存的高地址中,那data.b的值将会是0,就是大端模式。
  1. int强制类型转换char
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main()
{
int i = 1;
char* j = (char*)&i;
if (*j == 1) {
printf("小端存储");
} else {
printf("大端存储");
}
}

三、参考

  1. 参考一
  2. 参考二