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_数据的存储和排列 的相关文章

  • 计算机组成原理---总线带宽的计算

    end
  • 计算机组成原理实验四 微程序控制器实验报告

    我班算是几乎最后一个做实验的班级了 报告参考了一些朋友提供的数据加上一些自己的主观拙见 本人水平有限加之制作仓促难免有错误 望大家批评指正 4 1 微程序控制器实验 一 实验目的 1 掌握微程序控制器的组成原理 2 掌握微程序的编制 写入
  • booth算法

    booth算法 1 booth算法定义 2 二进制乘法过程 3 二进制乘法转换成 booth乘法运算 4 Radix 2 Booth乘法器 5 Radix 4 Booth乘法器 6 Booth乘法器计算实例 1 booth算法定义 将乘数看
  • 【计算机组成原理】笔记(B站王道考研)

    课程 B站 王道考研 截图来自课程 计算机硬件 p4 计算机硬件的基本组成 冯诺依曼结构 理解冯诺依曼计算机 在计算机系统中 软件和硬件在逻辑上等价 冯诺依曼计算机特点 计算机由运算器 控制器 存储器 输入设备 输出设备五大部件组成 指令和
  • 《计算机组成原理实验》 单周期CPU

    计算机组成原理实验 单周期CPU 前言 这是中山大学2018年计算机组成原理实验中单周期CPU的实验报告 仿真与写板的内容暂略 所有源代码 包括写板 已经上传至我的github当中 欢迎大家访问 github个人主页 https stara
  • 计算机组成原理大题简答题,常见问题总结(必背)

    计算机中采用二进制主要原因 技术实现简单 计算机由逻辑电路组成 逻辑电路通常只有两个状态 开关的接通与断开 这两种状态正好可以用 1 和 0 表示 简化运算规则 两个二进制数和 积运算组合各有三种 运算规则简单 有利于简化计算机内部结果 提
  • 5.6.2_IEEE754

    文章目录 一 引子 二 移码 1 移码与补码 2 移码本身 1 127 2 3 3 偏置值 普通情况 特殊情况 三 IEEE 754标准 1 格式 2 类型 1 短浮点数 2 double型 3 案例 1 案例一 2 案例二 4 范围 1
  • 编码:8421 BCD码(彻底弄懂+6是什么意思,为什么要加6)

    一 解释一下什么是8421 首先要理解的是4bit表示1个十进制位 8421代表的是权值分配 8421码用0000 0001 1001分别表示0 1 2 9的数字 为什么13不是1101 答 不在映射表 8421码的1010 1111没意义
  • 如何吃透csapp

    读薄 读厚csapp 非常不错的博客 既有对书本内容的理解 也有对实验内容的剖析 当然我还没看 先马 并且立个flag 必看完csapp 看完奖励自己一趟旅行 EOF 补充 本书的使用指南
  • 计算机组成原理笔记03

    计算机组成原理笔记03 做题笔记1 内容 教材的思维导图 课后练习 计算部分 中国大学MOOC计算机组成原理 计算部分 1 教材的思维导图 在看题之前 最好先看这篇定点运算 写的特别清晰明了 2 课后练习 3 2 选择题 1 一个C语言程序
  • 补码除法运算(加减交替法)

    x 补 00 1000 除数y 补 11 0101 两个数是异号 因此使用x 补 y 补 11 1101 11 1101继续与y 补 对比 发现是同号 商上1 余数11 1101向左移动一位 再加上 y 补 结果为00 0101 余数00
  • [计算机组成原理] 以低字节地址为字地址

    以低字节地址为字地址 就是小端存储模式 数据低位 或者说低字节 存储在内存低地址 以高字节地址为字地址 就是大端存储模式 数据低位 或者说高字节 存储在内存高地址 现在看一个例题 这个题目有一个需要明确的地方 什么是第一 第二 第三字节 对
  • 计算机的性能公式

    cpu执行时间 简称CPU时间 表示执行某一任务在CPU上所花费的时间 不包括等待I O或运行其他程序的时间 程序的cpu执行时间 cpu时钟周期数 时钟周期时间 cpu时钟周期数 主频 要想缩短cpu执行时间 最简单的方法就是缩短cpu的
  • 计算机组成原理——万字详解

    引言 作为还在学习的学生和不断进步的同事 学习计算机组成原理具有以下几个重要的好处 它可以帮助你深入理解计算机系统的工作原理 包括处理器 存储器 输入输出设备等组成部分之间的交互关系 这种深入理解可以提高你对计算机系统的整体把握能力 让你能
  • 计算机组成原理 总线与微命令实验

    总线与微命令实验 实验环境 计算机组成原理实验环境 实验目的 理解总线的概念和作用 连接运算器与存储器 熟悉计算机的数据通路 理解微命令与微操作的概念 实验要求 做好实验预习 读懂实验电路图 熟悉实验元器件的功能特性和使用方法 按照实验内容
  • 【计算机组成原理】实验4:存储器读写实验

    实验内容 一 实验原理 存储器是计算机的存储部件 用于存放程序和数据 存储器是计算机信息存储的核心 是计算机必不可少的部件之一 计算机就是按存放在存储器中的程序自动有序不间断地进行工作 本系统从提高存储器存储信息效率的角度设计数据通路 按现
  • 面向对象编程是什么意思呢?汇总

    https blog csdn net qq 32381815 article details 79119996 面向对象思想 谈谈你对面向对象的理解 https blog csdn net qsbbl article details 71
  • 计算机组成原理期末复习【超实用】

    计算机组成原理 第二版 唐朔飞 编著 课本有些地方还不错 可以下载电子版看看 b站2小时讲解链接 https www bilibili com video BV1x4411q7Fz 初次录讲解视频 各种差错和画音不同步请各位谅解 我录到后面
  • 第一章 计算机系统概论

    一 计算机系统简介 1 计算机软硬件概念 计算机是一种能够执行指令的电子设备 它由硬件和软件两部分组成 计算机硬件是指计算机系统中的物理组件 包括中央处理器 CPU 内存 硬盘 输入设备 如键盘 鼠标 输出设备 如显示器 打印机 等 这些硬
  • 5.1 中央寄存器的原理和组成

    思维导图 中央处理器 CPU 核心原理与组成 引言 中央处理器 CPU 作为计算机的 大脑 在现代计算机硬件中扮演着至关重要的角色 本文旨在深入探讨CPU的基本原理和组成部分 为读者提供一个全面的理解 CPU的基本原理 1 信息处理 CPU

随机推荐

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

    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 型变量 在很多时候占