判断主机字节序大端规则或小端规则方法

大端规则与小端规则

在计算机存储中存储字节的顺序有两种分别为大端规则和小端规则。

  • 小端规则(littel endian):低序字节存储到内存较低的位置,即起始位置。
  • 大端规则(big endian):低序字节存储到内存较高的位置,即高序字节存储到起始位置。

有一个32位数字为:0x01020304

小端规则的机器上,其存储如下:

低地址 -> -> 高地址
0x04 0x03 0x02 0x01

大端规则机器上,其存储如下:

低地址 -> -> 高地址
0x01 0x02 0x03 0x04

判断当前机器字节序的方法

判断当前机器为大端规则还是小端规则,其本质是对于一个变量,判断其各字节的存储顺序

方法一:使用union判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
int main() {
union {
short a;
char c[2];
} u;
u.a = 0x0102;
if (u.c[0] == 2 && u.c[1] == 1) {
std::cout << "little" << std::endl;
} else if (u.c[0] == 1 && u.c[1] == 2) {
std::cout << "big" << std::endl;
} else {
std::cout << "unkown" << std::endl;
}
return 0;
}

方法二:直接将字节取出,判断顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
int main() {
short s = 0x0102;
char* a = (char*)(&s);
std::cout << (*a) << std::endl;
char b = 0x02, c = 0x01;
if (((*a) | b) == b) {
std::cout << "little" << std::endl;
} else if (((*a) | c) == b) {
std::cout << "big" << std::endl;
} else {
std::cout << "unknow" << std::endl;
}
return 0;
}

Comment and share

  • page 1 of 1

魏传柳(2824759538@qq.com)

author.bio


Tencent


ShenZhen,China