目录
[1. 用代码来区分](#1. 用代码来区分)
[2. 通过VS编译器的监视窗口和内存窗口](#2. 通过VS编译器的监视窗口和内存窗口)
一、什么是大小端字节序?
- 字节序 :是指二进制数的数位(高位在左,低位在右)保存在地址中的方法。
- 大端字节序 :把二进制数的高位字放在低地址的保存方法。
- 小端字节序 :与大端字节序相反。
记忆口诀:大低高,小低低(小弟弟)
或者记忆:一个二进制数放入由低到高的地址时,看起来和原来不一样的就是小端。
【举例】比如二进制数 0x12 34 56 78在内存中的表示形式为:
- 大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78- 小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
二、为什么会出现大小端之分?
主要是由底层硬件体系结构的设计选择引起的,有的设计师认为大端更符合人类的阅读习惯;而有的设计师则认为小端从低地址到高地址能不经转换直接读出一个数字,效率更高。
总的来说:大端存储更符合人类的阅读习惯;小端存储效率更高。
三、实际应用
- 网络传输:在TCP/IP协议栈中,网络字节序通常被定义为大端字节序,这是为了保证在不同系统之间传输数据时的一致性。
- 文件系统:不同的文件系统可能有不同的字节序要求,但在同一个系统中,文件系统通常与CPU的字节序保持一致。
- CPU架构:不同的CPU架构可能使用不同的字节序。例如,Intel的x86系列CPU使用的是小端字节序,而Motorola的某些CPU则使用大端字节序。
四、如何区分当前机器是大端还是小端?
1. 用代码来区分
cpp
// 如何判断当前机器是大端还是小端?
#include<iostream>
using namespace std;
int main()
{
int a = 0x0000000000000001; //a = 1的二进制表示。
// 如果机器是大端,低地址保存高数位的字节,&a的第一个字节保存0x000即数字0
// 如果机器是小端,低地址保存低数位的字节,&a的第一个字节保存0x001即数字1
// 让指针p1指向整型变量a的第一个字节的地址
char* p1 = (char*)&a;
// 让指针p2指向整型变量a的第二个字节的地址
char* p2 = (char*)&a+1;
cout << (int)*p1 << endl; //ASCII码为1的字符无法被打印出来,转为整型来打印
cout << (int)*p2 << endl;
// 通过判断a最低位地址中保存的数据来判断当前机器的大小端。
if (*p1 == 1)
cout << "当前机器是小端字节序。" << endl;
else
cout << "当前机器是大端字节序。" << endl;
return 0;
}
2. 通过VS编译器的监视窗口和内存窗口
a. 打开监视窗口
按下F10开启调试模式 ---> 选择导航栏的调试按钮 ---> 选择窗口 ---> 选择监视 ---> 选择任意窗口。
b. 获取变量地址
在监视窗口中输入 &变量名 来获取变量地址。
c. 打开内存窗口
一样的步骤:
d. 在内存窗口中输入变量的地址
通过VS编译器的监视窗口和内存窗口可观察到,博主的电脑以小端字节序存储数据。
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。