「C/C++ 01」大小端字节序

目录

一、什么是大小端字节序?

二、为什么会出现大小端之分?

三、实际应用

四、如何区分当前机器是大端还是小端?

[1. 用代码来区分](#1. 用代码来区分)

[2. 通过VS编译器的监视窗口和内存窗口](#2. 通过VS编译器的监视窗口和内存窗口)


一、什么是大小端字节序?

  • 字节序 :是指二进制数的数位(高位在左,低位在右)保存在地址中的方法。
  • 大端字节序 :把二进制数的高位字放在低地址的保存方法。
  • 小端字节序 :与大端字节序相反。

记忆口诀:大低高,小低低(小弟弟)

或者记忆:一个二进制数放入由低到高的地址时,看起来和原来不一样的就是小端。
【举例】比如二进制数 0x12 34 56 78在内存中的表示形式为:

  1. 大端模式:
    低地址 -----------------> 高地址
    0x12 | 0x34 | 0x56 | 0x78
  2. 小端模式:
    低地址 ------------------> 高地址
    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-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

相关推荐
SmartRadio9 分钟前
MK8000(UWB射频芯片)与DW1000的协议适配
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·dw1000
guygg8810 分钟前
基于捷联惯导与多普勒计程仪组合导航的MATLAB算法实现
开发语言·算法·matlab
froginwe1125 分钟前
Rust 文件与 IO
开发语言
liulilittle28 分钟前
LIBTCPIP 技术探秘(tun2sys-socket)
开发语言·网络·c++·信息与通信·通信·tun
yyy(十一月限定版)28 分钟前
c++(3)类和对象(中)
java·开发语言·c++
落羽凉笙31 分钟前
Python基础(4)| 玩转循环结构:for、while与嵌套循环全解析(附源码)
android·开发语言·python
ytttr87333 分钟前
MATLAB的流体动力学与热传导模拟仿真实现
开发语言·matlab
山上三树36 分钟前
详细介绍 C 语言中的 #define 宏定义
c语言·开发语言·算法
测试游记1 小时前
基于 FastGPT 的 LangChain.js + RAG 系统实现
开发语言·前端·javascript·langchain·ecmascript
小罗和阿泽1 小时前
java 【多线程基础 三】
java·开发语言