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

news2024/11/13 18:01:46

目录

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");
	else
		printf("大端\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.coloradmin.cn/o/2153146.html

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

相关文章

在腾讯云申请https(我得是腾讯云服务器),通过宝塔设置https

参考 一键 HTTPS:https://cloud.tencent.com/document/product/400/58062 DNS 验证:https://cloud.tencent.com/document/product/400/54500?from_cn_redirect1 申请免费的证书 访问连接:https://console.cloud.tencent.com/ssl 点击页…

Python数据分析与可视化(Python绘图详解)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【更新】上市公司绿色专利申请及授权数据(2000-2023年)

一、数据介绍 数据名称:上市公司-绿色专利申请、授权数据 数据范围:A股上市公司 数据年份:2000-2023年 数据样本:61243条 数据来源:国家知识产权局 二、数据指标 年份股票代码股票简称行业名称行业代码省份城市区…

SQL - 基础语法

SQL作为一种操作命令集, 以其丰富的功能受到业内人士的广泛欢迎, 成为提升数据库操作效率的保障。SQL Server数据库的应用,能够有效提升数据请求与返回的速度,有效应对复杂任务的处理,是提升工作效率的关键。 由于SQL Servers数据库管理系统…

★pwn 更改pwn题libc保姆级教程★

★pwn 更改pwn题libc保姆级教程★ 🍚前言🥟安装🥟glibc-all-in-one下载与调整libc🥟patchelf更改libc🥟clibc的使用与分析 🍚前言 现在市面上有很多关于改libc的教程,但是基本有以下几个问题&a…

IDEA中实现springboot热部署

IDEA中实现springboot热部署 热部署: 每一次修改代码后会自动更新&#xff0c;无需每次重启 依赖(pom.xml) 修改后记得Reload一下 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><…

微信小程序IOS真机调试-onPullDownRefresh和onReachBottom不生效

切换真机调试2.0版本 勾选JS编译成ES5 如果使用了 uniapp&#xff0c;这里也需要勾选 重新启动

系统架构笔记-3-信息系统基础知识

知识要点 结构化方法&#xff1a;结构是指系统内各个组成要素之间的相互联系、相互作用的框架。结构化方法也称为生命周期法&#xff0c;是一种传统的信息系统开发方法&#xff0c;由结构化分析、结构化设计、结构化程序设计三部分有机组合而成&#xff0c;精髓是自顶向下、逐…

Java笔试面试题AI答之设计模式(2)

文章目录 6. 什么是单例模式&#xff0c;以及他解决的问题&#xff0c;应用的环境 &#xff1f;解决的问题应用的环境实现方式 7. 什么是工厂模式&#xff0c;以及他解决的问题&#xff0c;应用的环境 &#xff1f;工厂模式简述工厂模式解决的问题工厂模式的应用环境工厂模式的…

高算力芯片的发展

最近参与了2024年北京AI芯片峰会&#xff0c;虽然是讲AI芯片&#xff0c;但因为目前算力主要讲的是智能算力&#xff0c;所以&#xff0c;针对高算力芯片的发展趋势有重点的讲解。之前没有很系统关注这块&#xff0c;这次算是做了全面了解。下面&#xff0c;借用峰会的一些内容…

九章云极DataCanvas公司荣获2024年服贸会“科技创新服务示范案例”

9月15日&#xff0c;2024年中国国际服务贸易交易会&#xff08;服贸会&#xff09;示范案例交流会暨颁奖典礼在北京国家会议中心举行&#xff0c;九章云极DataCanvas 公司自研的DataCanvas Alaya NeW智算操作系统凭借卓越的AI创新实力、前瞻性的市场布局以及突破性的技术革新成…

uniapp中使用echarts 完整步骤,包括报错以及解决方案

在我们日常可能会有小程序中要使用echarts&#xff0c;我今天总结了一下整个引入的步骤 首先echarts - DCloud 插件市场在插件市场里面导入进项目&#xff0c;我这边用的是vue3的以及主要开发小程序&#xff0c;就直接放我的案例了 按照上面的步骤&#xff0c;在样式部分这样…

javaseday28 IO

IO流 IO流;存储和读取数据的解决方案。 纯文本文件&#xff1a;Windows自带的记事本打开能读懂的文件&#xff0c;word和Excel不是纯文本文件&#xff0c;txt和md是纯文本文件。 小结 IO流体系 FileOutputStream public class Demo1 {public static void main(String[] args)…

【学习笔记】 使用AD24完成相同电路的自动布线布局(相同模块布局布线ROOM布线快速克隆)

【学习笔记】 使用AD24完成相同电路的自动布线布局 一、适用基本条件二、基于ROOM的自动布局/布线的方法三、可能出现的报错四、ROOM自动布局的一些优点和缺点 当面对多个相同电路模块时&#xff0c;使用 ROOM 可以一次性对一个模块进行精心布局&#xff0c;然后将该布局快速复…

2024 研究生数学建模竞赛(C题)建模秘籍|数据驱动下磁性元件的磁芯损耗建模|文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用数据拟合&#xff0c;方差分析&#xff08;ANOVA&#xff09;&#xff0c;特征提取&#xff0c;多目标优化等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案…

vs2022快捷键异常不起作用解决办法

安装了新版本的vs2022&#xff0c;安装成功后&#xff0c;发现快捷键发生异常&#xff0c;之前常用的快捷键要么发生改变&#xff0c;要么无法使用&#xff0c;比如原来注释代码的快捷键是ctrlec&#xff0c;最新安装版本变成了ctrlkc&#xff0c;以前编译代码的快捷键是F6或者…

go webapi上传文件 部属到linux

go厉害的地方&#xff0c;linux服务器上无需安装任务依赖就可以运行&#xff0c;大赞&#xff01; 一、编译 #在Goland中cmd中执行 go env -w GOARCHamd64 go env -w GOOSlinux go build main.go # 切换回来 否则无法运行 go env -w GOOSwindows go run main.go 拷贝到linux服…

ubuntu如何进行自动mount硬盘(简易法)

1. 找到你ubuntu的disk工具 2. 选中你要mount的盘 3. 点击那个设置按钮 4. 选择edit mount options 5. disable user session defaults 6, 填写Mount Point就可以了&#xff0c; 最后输入一次密码&#xff0c;重启设备就搞定了

DOG:知识图谱大模型问答的迭代交互式推理,克服长路径和假阳性关系挑战

DOG&#xff1a;知识图谱大模型问答的迭代交互式推理&#xff0c;克服长路径和假阳性关系挑战 秒懂大纲提出背景解法拆解全流程优化和医学关系 创意 秒懂大纲 ├── DoG框架【主题】 │ ├── 背景【研究背景】 │ │ ├── LLMs的局限性【问题描述】 │ │ │ …

pgvector docker版安装;稀疏向量使用;psycopg2 python连接使用

参看: https://cloud.tencent.com/developer/article/2359831 https://hub.docker.com/r/pgvector/pgvector/tags https://github.com/pgvector/pgvector 一、安装 拉取0.7版本 docker pull pgvector/pgvector:0.7.4-pg16运行: docker run --name pgvector -v $(pwd)/dat…