5.5_数据的存储和排列

2023-11-05


在这个小结中,我们要探讨的是 数据的存储和排列

一、大小端模式

首先来看一个之前提到过的问题,叫做大小端模式。我们在内存里经常会存储某一些多字节的数据,比如 c 语言里的 Int 型变量,在很多时候占 4 个字节。

我们用 16 进制的方式把 4 个字节的内容给描述出来。
image.png

最左边01这个部分我们可以把它称为最高有效字节,最右边67我们可以把它称为最低有效字节。英文缩写也要注意,分别是 MSB 和LSB。

如果把这个 4 字节的 Int 型变量翻译为 10 进制,应该对应的是19088743这样的一个正整数。
image.png

而如果把这个 16 进制数翻译成 2 进制的形式,应该是下面这样的。总共有 32 个比特, 4 个字节。
image.png

之前我们说过,对于这种多字节的数据,它在内存里边一定是占据连续的几个字节的。

根据这些字节在内存里的排列方式不同,我们可以有两种存储这种多字节数据的方式,一种叫大端,一种叫小端

大端方式

大端方式的存储会更符合我们人类阅读的习惯。 这儿我们上面给的 0800 H、 0801 H 这些指的是内存地址,左边是内存的低地址部分,右边是内存的高地址部分。
image.png

因此所谓的大端模式,就是把最高的有效字节存到更低地址的部分,最低有效字节存在了最高的地址部分。

整个 Int 型变量占据连续的 4 个字节,这是大端存储的方式。

小端方式

小端方式就是把它逆过来。在低地址的部分存储最低有效字节,在高地址的部分存储最高有效字节。是逆过来存储的。
image.png

小端方式显然不太符合我们阅读的习惯,我们要阅读 4 字节数据的时候,得把它逆过来拼凑。

虽然小端方式不方便让我们阅读,但是它更方便让机器进行处理。

因为机器在处理这种多字节数据的时候,通常也是按照这种内存地址递增的次序来读取多字节数据里边的这些每一个字节或者每一个字的。

也就是机器在读取这 4 个字节的 Int 型变量的时候,如果它每次只能读取一个字节,那么它先读入的一定是低地址部分的这一个字节
image.png

如果用大端方式,就相当于先把最高有效字节给读入,一直往后到最后才读入最低有效字节。

而如果是小端模式,就意味着它会先读入最低有效字节,慢慢的读入最高有效字节。这么做是有好处的。

比如如果我们的CPU,它每一次只能处理8位二进制的加法运算,当 CPU 对两个 Int 型变量进行加法操作的时候,显然应该先从它的最低有效字节先进行加法,再加次低位的字节。

所以,如果使用小端方式来存储,计算机首先从内存里读入的就是最初最应该先被处理的字节。

所以小端存储的方式会更便于机器的处理。

这是大端方式和小端方式的区别。

二、边界对齐

接下来再探讨一个问题,叫做边界对齐的存储方式。

现代的计算机通常是按照字节编址。所谓按字节编址,就是指每一个字节会对应一个地址。

如果结合下面这个图,第一个字节我们可以把它编址内存地址对应的是0,第二个字节对应的内存地址是1,第三个对应的是2,第四个对应的是3。
image.png

在这个图里边,除了字节之外,大家还会发现半字和字这样的一种描述方式。

假设计算机,它的存储字长为 32 位,一个字就是 32 个比特位,一个半字就是 16 个比特。

现代计算机虽然是按照字节编址,但是通常来说也可以支持按字或者按半字来进行寻址的操作

什么意思呢?

按字节寻址

比如一条指令,它可以指明我要访问的是内存里地址编号为 4 的字节。由于我要寻找的是一个字节,所以最终找到的应该是这儿我们画出的字节,这个字节的编号刚好为 4。这是按字节寻址
image.png

按半字寻址

什么叫按半字寻址?

比如我同样可以指定我这次要访问的是编号为 3 的半字。

由于一个半字是 16 个比特,所以最开始的两个字节组成了 0 号半字,接下来的这两个字节组成了 1 号半字,再往后的这两个字节组成了 2 号半字,接下来的两个字节又组成了编号为 3 的半字。
image.png

所以,如果我要按半字寻址,我指明了我要访问的是 3 号半字,就意味着接下来我要读入的就是我要访问的就是这两个字节的内容。这是按半字寻址。
image.png

按字寻址

按字寻址也是类似的原理。

由于每个字占 32 个比特,也就是 4 个字节,所以这儿我们画的一整行 4 个字节组成了一个字。因此我可以指明我这次要访问的是 2 号字,下图标明了分别是 0 号字, 1 号字, 2 号字。
image.png

所以要访问 2 号字,就意味着我要把这四个字节的内容给读入。
image.png

这就是所谓按字按半字和按字节寻址的意思。


大家会发现,我们一个半字对应两个字节(2B),一个字对应四个字节(4B)。

所以当我们给出我们要访问的字地址的时候,要怎么把它转换成与之对应的字节地址呢

很简单,我们只需要把字地址逻辑左移两位就可以。因为逻辑左移 1 位意味着乘以2,逻辑左移 2 位,意味着乘以4。

所以像刚才这个例子当中,第一个字节我们把它编号为0,接下来第二行的第一个字节编号应该是4,再往后的字节编号应该是8,接下来这个字节编号应该是12,这是每一行的第一个字节的字节地址。
image.png

现在我要访问编号为 2 的字,也就是要访问第三行的这一整个字。

我们要把字地址转换成用字节描述的地址

很简单,2号字它用二进制表示,应该是 10 。我们把它逻辑左移两位,就相当于在末尾又添了两个0。二进制翻译过来应该是8。如下:
image.png

所以 2 号字的起始地址就是 8 号字节位置。

从 8 号字节开始,读出连续的四个字节,这就是 2 号字的内容。


半字的原理也是一样,我们给出半字地址之后,想把它转换成字节地址,只需要逻辑左移1位,也就是在末尾添一个 0 就可以。

这是按字按半字,还有按字节寻址的意思。

现代计算机都是按字节编址的。也就是无论我们要访问的是字、半字还是字节,最终肯定需要转换成相对应的字节地址。转换方法就是逻辑左移

这我们还需要强调一个事情,我们每次访存只能读写一个字的内容,并且这儿所谓的一个字就是我们这儿的一整行,不能跨行读取。
image.png

所以基于这种特性,有的计算机会采取数据边界对齐的方式,也就是我们上边图的这种方式。

也有的计算机会采用边界不对齐的方式,也就是下面这种方式。
image.png

举个例子。

在 c 语言里边,char型变量刚好占 1 个字节, short 型的变量刚好占 2 个字节, Int 型的变量占 4 个字节。

如果我定义了一个结构体,这个结构体里边包含了 3 个char型的变量, 3 个 short 型的变量,还有一个 Int 型的变量。

如果按边界对齐的方式,我们在存储了刚开始的三个char型变量之后,最开始的这一个字还会剩下一个字节的空间。但是接下来我们要存储的 short 型变量,它必须占一个半字,也就是两个字节。
image.png

如果采用的是边界不对齐的方式,我们可以把 short 型的变量第一个字节就放在这一个字的末尾这个地方,把 short 型变量的第二个字节放到第二个字最开始的地方。
image.png

基于之前我们提到的读写,仿存相关的特性,我们可以知道,如果按照这种边界不对齐的方式来存储,就意味着当我们要读出 short 型变量的时候,下边这种方案我们必须进行两次访存

因为第一次访存,我们读入的是最上面这一整个字的内容,而第二次访存,我们才能读入第二个字的内容。

只有把这两个字的内容都读入,再把最末尾的字节和最开头的字节进行一个拼接,我们才可以得到 short 型变量的一个完整的表示。
image.png

而如果采用上边这种边界对齐的方式来存储,最后只剩一个字节,存不下半字的数据,我们就会干脆把这一个字节给浪费掉。

虽然空间上能会有一些浪费,但是当我们要读入 short 型变量的时候,只需要进行一次访存就可以,因为这个变量的所有数据都是存放在这一整个字里边的。如下:
image.png

所以这就是边界对齐方式和边界不对齐方式的一个对比。

显然,边界对齐方式它是一种空间换时间的一种策略,虽然我们会浪费某一些空间,但是浪费这些存储空间可以换来更快的仿存效率,所以边界对齐的这种存储策略也是值得的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

5.5_数据的存储和排列 的相关文章

  • 总线带宽计算公式_「计算机组成原理」:总线概述

    计算机系统的五大部件之间连接的方式有两种 xff0c 一种是各部件之间使用单独的连线 xff0c 称为分散连接 一种是将各部件连到一组公共信息传输线上 xff0c 称为总线连接 总线的基本概念 计算机系统的五大部件之间连接的方式有两种 xf
  • 计算机组成原理之运算器篇章之---比恢复余数法更好的加减交替法!详解+例子

    加减交替法 又称为不恢复余数法 是恢复余数法的一种算法的提升 步骤示例 例题 已知x 0 1011 y 0 1101 求 x y 原 y 补 0 1101 y 补 1 0011 例题 已知x 0 1011 y 0 1101 求 x y 原
  • 多处理器的基本概念

    SISD 单指令流单数据流 特性 各指令序列只能并发 不能并行 每条指令处理一两个数据 不是 数据级并行技术 硬件组成 一个处理器 一个主存储器 若采用指令流水线 需设置多个功能部件 采用多模块交叉存储器 SIMD 单指令流多数据流 特性
  • 《计算机组成原理实验》 单周期CPU

    计算机组成原理实验 单周期CPU 前言 这是中山大学2018年计算机组成原理实验中单周期CPU的实验报告 仿真与写板的内容暂略 所有源代码 包括写板 已经上传至我的github当中 欢迎大家访问 github个人主页 https stara
  • 第二章 计算机发展与应用

    计算机从诞生至今已经经历了多个阶段的发展 包括 1 电子管时代 1940年代 1950年代 计算机使用电子管作为主要的电子元件 这些计算机体积庞大 功耗大 但是它们标志着计算机的诞生 并且在二战期间被广泛应用于军事领域 2 晶体管时代 19
  • 虚拟存储器

    文章目录 虚拟存储器 一 虚拟存储器概述 二 页式虚拟存储器 例题分析 三 段式与段页式虚拟存储器 虚拟存储器 一 虚拟存储器概述 1 引入原因 高速的主存容量满足不了要求 虚拟存储器 在操作系统及辅助硬件的管理下 由主存和大容量外存所构成
  • 计算机组成原理学习笔记——六、总线

    文章目录 计算机组成原理学习笔记 六 CPU总线 6 1 总线概述 6 2 总线仲裁 6 3 总线操作和定时 6 4 总线标准 小结 计算机组成原理学习笔记 六 CPU总线 6 1 总线概述 总线的猝发传送方式 一个总线周期内传输存储地址连
  • 【计算机组成原理】16-定点数与浮点数

    一 定点数的表示方法 1 纯小数 乘以比例因子以满足定点数保存格式 2 纯整数 小数点在后面 二 浮点数的表示方法 计算机处理的很大程度上不是纯小数或纯整数 数据范围很大 定点数难以表达 1 浮点数的表示格式 科学计数法 j S 尾数 r
  • 动态链接,程序内部的共享单车

    前言 在之前说过 程序的编译过程是 编译 汇编 链接 前面的两种方式我们已经充分的理解过了 现在我们来说说我们的链接过程 我们很多时候要做到代码的复用 我们就需要链接不同的库 这么来说 我们链接的过程就有点像生活中标准化 模块化的生产 我们
  • 【笔记】CPU的结构和功能(一)

    一 CPU的结构 1 CPU的功能 2 CPU结构框图 3 CPU的寄存器 用户可见寄存器 控制和状态寄存器 4 控制单元和中断系统 二 指令周期 1 指令周期的基本概念 2 指令周期的数据流 取指周期数据流 间址周期的数据流 执行周期的数
  • 补码除法运算(加减交替法)

    x 补 00 1000 除数y 补 11 0101 两个数是异号 因此使用x 补 y 补 11 1101 11 1101继续与y 补 对比 发现是同号 商上1 余数11 1101向左移动一位 再加上 y 补 结果为00 0101 余数00
  • 5.5_数据的存储和排列

    文章目录 一 大小端模式 二 边界对齐 在这个小结中 我们要探讨的是 数据的存储和排列 一 大小端模式 首先来看一个之前提到过的问题 叫做大小端模式 我们在内存里经常会存储某一些多字节的数据 比如 c 语言里的 Int 型变量 在很多时候占
  • [计算机组成原理] 以低字节地址为字地址

    以低字节地址为字地址 就是小端存储模式 数据低位 或者说低字节 存储在内存低地址 以高字节地址为字地址 就是大端存储模式 数据低位 或者说高字节 存储在内存高地址 现在看一个例题 这个题目有一个需要明确的地方 什么是第一 第二 第三字节 对
  • 计算机组成原理实验二 存储系统预习报告

    实验一 静态RAM 一 实验目的 掌握静态随机存储器 RAM 工作特性及数据的读写方法 基于信号时序图 了解读写静态随机存储器的原理 二 实验预习 1 阅读实验指导书 然后回答问题 实验所用的静态存储器由一片 6116 2K 8bit 构成
  • 计算机组成原理笔记

    CPU的功能和结构 运算器 对数据进行加工 算术逻辑单元ALU 暂存寄存器 通用寄存器 累加寄存器ACC 程序状态字寄存器PSW 移位器 计数器 控制器 取指令 分析指令 执行指令 中断处理 程序计数器PC 指令寄存器IR 指令译码器 时序
  • 计算机组成原理慕课测试-第四单元

    计算机字长32位 主存容量为128MB 按字编址 其寻址范围为 0 32M 1 1 B 8b 1 kB 1024 B kB kilobajt 千 1 MB 1024 kB MB megabajt 兆 1 MB 1024 kB MB mega
  • 【计组笔记-5】详细测试c++中类型转换的溢出截断处理

    计组笔记 5 详细测试c 中类型转换的溢出截断处理 1 将小数赋值给float 2 将整数赋值给float 3 将整数赋值给int 3 1 算术溢出 3 2 非算术溢出 等于32位 3 3 非算术溢出 大于32位 4 将小数赋值给int 5
  • 浮点数

    为什么要有浮点数 从十进制科学计数法理解浮点数 计算机中二进制的浮点数 二进制中阶码的底也可以不为2 例如 二进制中阶码的底可以为4 为8等等 当阶码的底为2 假设阶码为 1 则小数点需要后移一位 即算数左移一位 当阶码的底为4时 假设阶码
  • 补码加减运算及判断溢出方法

    一 补码加减运算 二 判断溢出方法 1 符号位判溢出方法 对于加减运算 两个异号数相加或者两个同号数相减 结果的绝对值一定比任何一个数的绝对值要小 不会发生上溢出 两个异号数相减或者两个同号数相加的绝对值肯定比任何一个数要大 可能发生溢出
  • 计算机组成原理综合1

    1 完整的 计算机系统 应包括 D A 运算器 存储器和控制器 B 外部设备和主机 C 主机和实用程序 D 配套的硬件设备和软件系统 2 计算机系统中的存储器系统是指 D A RAM存储器 B ROM存储器 C 主存储器 D 主存储器和外存

随机推荐

  • 机器学习——生成分类数据的坐标系边界需要用到的技术方法

    0 前言 如果遇到一种应用场景需要将x轴数据和y轴数据所有点映射到坐标系中 需要得到坐标系中x和y映射的坐标点 就要用到meshgrid把x和y映射到坐标系中 然后把得到的结果用ravel把结果转成一维的 用np c 把x数据和y数据堆叠在
  • HTML01

    若有 double p x 10 int i 5 使指针变量 p指向元素 x 5 的语句为 正确答案 A 你的答案 A 正确 p x i p x p x i p x i 设函数fun和实参数组的说明形式为 void fun char ch
  • 解决Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“报错

    Microsoft Visual C 14 0 or greater is required Get it with Microsoft C Build Tools 具体报错如下 Building wheel for cyac pyproj
  • 老猿学5G:融合计费基于流计费的触发器Triggers

    前往老猿Python博文目录 一 概述 每个触发条件都是一个可计费事件 SMF中的功能体CTF在用户上网时达到一定条件就会向CHF上报流量 而CTF什么时候触发流量上报是由CTF中的触发器来控制的 当用户UE发起上网行为时 SMF中的CTF
  • 汇编逆向-Qt

    Qt源码解析 索引 汇编逆向 授权破解示例分析 问题模拟 运行环境 x64dbg Windows 10 Qt5 12 3 示例代码 使用Qt显示当前时间 模拟一般授权软件的时间判断逻辑 当时间超过授权日期后就提示授权过期 没有Qt经验的同学
  • Java中方法定义和调用的学习

    方法其实就是若干语句的功能集合 参数 原料 就是进入方法的数据 返回值 原产物 就是从方法中出来的数据 定义方法的完整格式 修饰符 返回值类型 方法名称 参数类型 参数名称 方法体 return 返回值 修饰符 现阶段的固定写法 publi
  • VSCode 之 设置 settings.json 配置文件

    这篇文章主要介绍了 VSCode settings json 配置 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 VSCode 从插件库里安装 eslint 和 prettier 两个 插件 也 实现自动格式化
  • 微信小程序怎么和后台服务器交互

    要实现微信小程序和后台服务器之间的交互 可以使用以下方式 1 小程序发起HTTP请求 后台服务器接收和处理请求 返回相应结果 这是最常用的方式 可以使用小程序提供的wx request API来发送HTTP请求 后台服务器可以使用任何语言和
  • 获取动画状态机中动画片段的时间长度

    获取动画状态机中动画片段的长度 非常简单的代码 public float GetClipLength Animator animator string clipName if null animator string IsNullOrEmp
  • wps保存后怎么恢复

    单击窗口左上角的 WPS文字 或WPS表格 在出现的菜单中单击 备份管理 也可以通过任务窗格 文件菜单等 好多入口 单击右下角的 查看其他备份 按钮 找一下有没有你要的历史文档
  • jenkins学习笔记第十六篇 Jenkins·配置 Publish Over SSH 插件——访问远程服务器

    一般而言 Jenkins 不单单需要做到将远程仓库里的代码进行编译或者打包 还需要将编译后的代码上传到远程服务器 并且执行一些其他的命令 即 Github代码 编译得到war包 上传远程服务器 执行远程命令 Jenkins 是通过 SSH
  • STM32笔记15--串口通信基本原理

    15 1 串行通信接口背景知识 15 2 STM32F1串口框图讲解 参考资料 STM32开发指南 库函数 5 3 usart串口文件夹 第九章 串口实验 1 串行通信接口背景知识 首先 处理器与外部通信有两种常见方式 并行通信和串行通信
  • 架构的概念与介绍

    1 什么是架构和架构本质 在软件行业 对于什么是架构 都有很多的争论 每个人都有自己的理解 此君说的架构和彼君理解的架构未必是一回事 LInux有架构 MySQL有架构 JVM也有架构 使用Java开发 MySQL存储 跑在Linux上的业
  • r语言聚类分析_【SPSS数据分析】SPSS聚类分析(R型聚类)的软件操作与结果解读 ——【杏花开生物医药统计】...

    在上一讲中 我们讲述了针对样本进行聚类的分析方法 Q型聚类 今天我们将详细讲解针对变量数据进行的聚类分析 系统聚类之R型聚类 我们要将数据变量进行聚类 但不知道要分成几类 或者没有明确的分类指标的时候 就需要用到R型聚类 R型聚类分析不但可
  • 根据Sql生成ER图

    原文 https blog csdn net qq 17010367 article details 79212850 commentsedit 1 根据SQL文件生成ER图 首先准备好SQL文件 然后在PowerDesigner 里 点击
  • 字符串表达式校验&求值(C#实现) - 附代码

    一 参考文献 严蔚敏 数据结构 C语言版 二 功能演示 1 测试例子 2 测试结果 三 对表达式进行校验 怎么对输入的字符串表达式进行校验呢 1 对表达式按操作符进行拆分 返回一个字符串数组 代码 private static string
  • Oracle数据库删除重复数据

    Oracle数据库中如何删除重复数据 第一种情况 部分字段重复数据的删除 先查询出那些数据是重复的 select 字段1 字段2 count from 表名 group by 字段1 字段2 having count gt 1 将上面的大于
  • TIA博途S7-1200学习笔记——指令集

    目录 1 位逻辑运算操作 1 1 常开触点 1 2 常闭触点 1 3 取反触点 1 4 线圈 1 5 赋值取反 1 6 复位输出 1 7 置位输出 1 8 置位位域 1 9 复位位域 2 10 SR置位 复位触发器 1 11 RS复位 置位
  • 【activiti】网关

    activiti网关 网关是用来控制流程的走向的 1 排他网关 ExclusiveGateway 1 1 什么是排他网关 排他网关 用来在流程中实现决策 当执行到这个网关时 会根据判断条件去选择执行某一条分支 注意 排他网关只会选择一个为t
  • 5.5_数据的存储和排列

    文章目录 一 大小端模式 二 边界对齐 在这个小结中 我们要探讨的是 数据的存储和排列 一 大小端模式 首先来看一个之前提到过的问题 叫做大小端模式 我们在内存里经常会存储某一些多字节的数据 比如 c 语言里的 Int 型变量 在很多时候占