大小端字节序 和 内存高低地址顺序

目录

1. 大小端字节序

1.1 什么是大小端字节序?

1.2 为什么有大小端字节序? 

1.3 习题:用程序结果判断大端小端

2. 各种易混淆的高低地址顺序

2.1 监视窗口的地址表示【计算机标准展示方式】

2.2 横向地址表示

2.3 一个字节 与 多个字节 的地址顺序区别

2.4 内存空间的开辟顺序

3. 判断练习

1. 大小端字节序

1.1 什么是大小端字节序?

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题。按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:

  • 大小端描述的对象是低位字节
  • ⼤端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,⽽数据的高位字节内容,保存在内存的低地址处(低位数——高地址)
  • 小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处(低位数——低地址)

 假设现在有一个int型大小的16进制数0x11223344,它在小端序和大端序是下面这样的:    

Visual Studio 2022采用的是小端字节序存储。

代码演示:

int main()
{int a = 0x11223344; return 0;
}

1.2 为什么有大小端字节序? 

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8 bit 位,但是在C语⾔中除了8 bit 的 char 之外,还有16 bit 的 short 型,32 bit 的 long 型(要看 具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤ 于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和小端存储模式。

例如:⼀个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为⾼字节, 0x22 为低字节。对于⼤端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在⾼地址中,即 0x0011 中。⼩端模式,刚好相反。我们常⽤的 X86 结构是⼩端模式,⽽ KEIL C51 则为⼤端模式。很多的ARM,DSP都为⼩端模式。有些ARM处理器还可以由硬件来选择是 ⼤端模式还是⼩端模式。

1.3 习题:用程序结果判断大端小端

请简述⼤端字节序和⼩端字节序的概念,设计⼀个小程序来判断当前机器的字节序。--- 百度笔试题

分析:

  1. 假如我们有一个int型的十进制数1,如果是小端字节序,它的16进制排列是01 00 00 00;如果是大端字节序,它的16进制排列是00 00 00 01。
  2. 指针接收变量的地址是该变量最低地址
  3. 指针的类型决定指针访问的步长

知道了这几个知识,我们就可以写成这个程序:

int check_sys()
{int i = 1;return (*(char*)&i);
}int main()
{int ret = check_sys();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

在VS下输出是小端:

char*指针只能访问一个字节,如果是小端字节序,读到的是数据01,即十进制的1;如果是大端字节序,读到的数据是00,即十进制的0。

2. 各种易混淆的高低地址顺序

2.1 监视窗口的地址表示【计算机标准展示方式】

监视窗口的数据都是16进制的数字,常用“列4”的表示方式。

监视窗口的地址顺序:

(1)横轴:从左往右看,地址变低(左低右高)

(2)纵轴:从上往下看,地址变高(上低下高)

代码演示:(十进制的5 等于 十六进制的00 00 00 05)

int main()
{int a = 5;return 0;
}

列为4时的监视窗口展示顺序:(int是4个字节,所以“列4”是最常用的展示方式)

列为1时的监视窗口展示顺序:

图示:

2.2 横向地址表示

因为监视窗口的标准展示顺序既有横向的地址变化,又有竖向的地址变化,太过复杂。

为了方便自己的理解,我们常采用横向的地址顺序

(横向地址顺序不是第一次出现了,在我们学习数组的时候就已经接触过,只是当时用的数据是十进制的数据,没有大小端字节序的概念)

比如刚刚的int a=5,用横向的地址表示是下面这样:

图示:

2.3 一个字节 与 多个字节 的地址顺序区别

一个字节中,无地址顺序【无高低地址之分的数字位数顺序】

  • 数学上没有高低地址的说法,只是在物理的内存结构中有高低地址之分。
  • 而最小的内存单元的大小是一个字节,对于一个最小单元来说,本质是8个二进制数字显示的是2个16进制数字
  • 而一个数字是不会分高低地址的,只有高位数与低位数之分(即数字位数顺序)。
  • 数字位数顺序是固定的,从左向右 位序依次降低。比如十进制:从左往右,千位->百位->十位->个位……

多个字节中,有地址顺序,而且在VS2022中采用的是小端字节序的地址排序

  • 低位字节在低地址。
  • 低位的2个16进制数,放在低地址。

例如,我们有1个int型的数据:int a = 0x12345678(十六进制数)

它的内存图示是如下:

监视窗口也是这样:

2.4 内存空间的开辟顺序

对于前后创建的多个变量或数组

在debug,x86环境下:

栈区内存的使⽤习惯是从⾼地址向低地址使⽤的。【按代码顺序,先在高地址创建变量(或数组),再向低地址创建变量(或数组)】

在release环境 或 x64环境下:

栈区内存的使⽤习惯是从低地址向高地址使⽤的。【按代码顺序,先在低地址创建变量(或数组),再向高地址创建变量(或数组)】

具体的例子可以看我这篇博客:https://blog.csdn.net/2301_80030290/article/details/141333314?spm=1001.2014.3001.5502#t16

对于创建的同一个数组

  • arr[0]是最低的地址(首地址),元素越靠后地址越高

3. 判断练习

请判断下面的代码运行后的结果:(环境:VS2022 ,debug, X86)

int main()				//大小端的
{int arr[4] = { 1, 2, 3, 4 };int* ptr1 = (int*)(&arr + 1);int* ptr2 = (int*)((int)arr + 1);printf("%x\n%x", ptr1[-1], *ptr2);return 0;
}

运行结果:

画图解析

指针ptr1和ptr2都是整型指针,每次可访问4个字节。

这里ptr1[-1]访问的4个字节是:04 00 00 00。按小端字节序读取后的结果是16进制的0x00000004,也就是4。 

这里ptr2访问的4个字节是:00 00 00 02。按小端字节序读取后的结果是16进制的0x02000000,也就是2000000


本期分享完毕,感谢大家的支持~Thanks♪(・ω・)ノ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第416题分割等和子集

题目&#xff1a; 题解&#xff1a; bool canPartition(int* nums, int numsSize) {if (numsSize < 2) {return false;}int sum 0, maxNum 0;for (int i 0; i < numsSize; i) {sum nums[i];maxNum fmax(maxNum, nums[i]);}if (sum & 1) {return false;}int tar…

《程序猿之设计模式实战 · 适配器模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

24/9/24 算法笔记 超参数优化算法

在机器学习中&#xff0c;优化超参数的算法是至关重要的&#xff0c;因为它们可以帮助我们找到最佳的模型配置&#xff0c;从而提高模型的性能。以下是一些常用的超参数优化算法&#xff1a; 网格搜索&#xff08;Grid Search&#xff09;&#xff1a;这是一种穷举搜索的方法&a…

分布式系统实战经验

分布式系统是现代软件架构的核心部分&#xff0c;它通过多个计算节点协同工作来处理大规模数据和请求&#xff0c;提供高可用性、可扩展性和容错能力。在实际开发和运维中&#xff0c;构建分布式系统需要考虑多方面的挑战。以下是一些在分布式系统中的实战经验&#xff1a; 1.…

springboot文件上传+拦截器

springboot文件上传拦截器 文章目录 springboot文件上传拦截器1.静态资源访问静态目录&#xff1a; 2.文件上传文件上传配置文件书写文件上传代码 3.拦截器1.初始化拦截器2.初始化配置文件 1.静态资源访问 静态目录&#xff1a; 这里的static就是spring boot默认存放静态资源的…

ZYNQ FPGA自学笔记~操作PLL

一 时钟缓冲器、管理和路由 垂直时钟中心&#xff08;clock backbone&#xff09;将设备分为相邻的左侧和右侧区域&#xff0c;水平中心线将设备分为顶部和底部两侧。clock backbone中的资源镜像到水平相邻区域的两侧&#xff0c;从而将某些时钟资源扩展到水平相邻区域。BUFG不…

考研数据结构——C语言实现小顶堆

数组初始化&#xff1a; 首先&#xff0c;我们有一个整数数组arr&#xff0c;里面包含了一系列需要排序的数字。数组的长度n是通过对数组arr的总字节大小除以单个元素的字节大小得到的。 小顶堆调整函数&#xff1a; adjustHeapMin函数的作用是将数组中的元素从某个节点向下调整…

[001-02-001].第2节:java开发环境搭建

4.1.书籍推荐&#xff1a; 4.2.人机交互方式 1.图形化界面(Graphical User Interface GUI)这种方式简单直观&#xff0c;使用者易于接受&#xff0c;容易上手操作2.命令行方式(Command Line Interface CLI)&#xff1a;需要有一个控制台&#xff0c;输入特定的指令&#xff0c…

好用的工具网址

代码类&#xff1a; 1,json解析&#xff1a;JSON在线解析及格式化验证 - JSON.cn 2.传参转化编码 在线url网址编码、解码器-BeJSON.com 日常&#xff1a; 1.莆田医院查询&#xff1a;滚蛋吧&#xff01;莆田系

[数据结构]无头单向非循环链表的实现与应用

文章目录 一、引言二、线性表的基本概念1、线性表是什么2、链表与顺序表的区别3、无头单向非循环链表 三、无头单向非循环链表的实现1、结构体定义2、初始化3、销毁4、显示5、增删查改 四、分析无头单向非循环链表1、存储方式2、优点3、缺点 五、总结1、练习题2、源代码 一、引…

插入、更新与删除MySQL记录

在现代应用开发中,数据库操作是非常重要的一环。作为程序员,熟练掌握数据库的增删改功能,能够更有效地管理数据并提高开发效率。 本课程将围绕插入、更新与删除记录这三个操作展开,涵盖SQL中的常见语句:INSERT INTO、UPDATE 和 DELETE,并结合实际应用中的常见问题讨论如…

Scikit-learn 识别手写数字

Scikit-learn 识别手写数字的完整教程&#xff08;包含各模型预测结果和准确率&#xff09; 本教程将使用 Scikit-learn 提供的手写数字数据集&#xff0c;分别使用支持向量机 (SVM)、随机森林和逻辑回归三种模型进行训练&#xff0c;并展示它们的预测结果和准确率。 1. Scik…

Frontiers出版社系列SCISSCI合集

【SciencePub学术】本期&#xff0c;小编根据WOS数据库&#xff0c;整理了一下Frontiers出版社系列的SCI&SSCI合集&#xff0c;以供各位学者投稿参考&#xff01; 来源&#xff1a;WOS数据库 Frontiers系列期刊中&#xff0c;Frontiers in Immunology以其5.7分的影响因子位…

第十四届蓝桥杯嵌入式国赛

一. 前言 本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目&#xff0c;包括STM32CubeMx的相关配置以及相关功能实现代码以及我在做题过程中所遇到的一些问题和总结收获。如果有兴趣的伙伴还可以去做做其它届的真题&#xff0c;可去 蓝桥云课 上搜索历届真题即可。 二. 题目概述 …

每日一练:二叉树的层序遍历

102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 一、题目要求 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,n…

合宙LuatOS应用,与时间相关那些事

合宙嵌入式操作系统LuatOS——在蜂窝物联网模组上推出开源二次开发框架&#xff0c;功能齐全性能稳定&#xff0c;可大幅度降低用户的研发成本和研发周期。 在LuatOS中&#xff0c;获取时间函数用得最多的就是os.time()函数了。接下来&#xff0c;我会讲一些与这个函数以及其他…

c++924

2 #include <iostream> #include <cstring>using namespace std;class MyString { private:char *str; // 记录C风格的字符串int size; // 记录字符串的实际长度public:// 定义无参构造MyString() : size(0) {str new char[1];str[0] \0;cou…

中秋节特别游戏:给玉兔投喂月饼

&#x1f5bc;️ 效果展示 &#x1f4dc; 游戏背景 在中秋这个充满诗意的节日里&#xff0c;玉兔因为贪玩被赶下人间。在这个温柔的夜晚&#xff0c;我们希望通过一个小游戏&#xff0c;让玉兔感受到人间的温暖和关怀。&#x1f430;&#x1f319; &#x1f3ae; 游戏设计 人…

Oracle数据库的比较运算符Comparison Operators

Comparison operators compare one expression to another. The result is always either TRUE, FALSE, or NULL. If the value of one expression is NULL, then the result of the comparison is also NULL. 如果一个表达式的值为NULL&#xff0c;那么比较的结果也是NULL。 …

5、论文阅读:深水下的图像增强

深水下的图像增强 前言介绍贡献UWCNN介绍网络架构残差Residuals块 Blocks网络层密集串联网络深度减少边界伪影网络损失Loss后处理前言 水下场景中,与波长相关的光吸收和散射会降低图像的可见度,导致对比度低和色偏失真。为了解决这个问题,我们提出了一种基于卷积神经网络的…