「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-------------------------

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

相关推荐
Algorithm1576几秒前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明9 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly2116 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu17 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202117 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
7yewh20 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
waicsdn_haha31 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
嵌入式科普32 分钟前
十三、从0开始卷出一个新项目之瑞萨RZN2L串口DMA接收不定长
c语言·stm32·瑞萨·e2studio·rzn2l
_WndProc33 分钟前
C++ 日志输出
开发语言·c++·算法
qq_4335545442 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++