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

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

相关推荐
重生之我在20年代敲代码7 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
爱上语文8 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
2401_858286113 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py3 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy3 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
jiao000015 小时前
数据结构——队列
c语言·数据结构·算法
铁匠匠匠5 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
C-SDN花园GGbond5 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处6 小时前
C++ —— 关于vector
开发语言·c++·算法