数据存储和内存对齐

校内课复习笔记

非数值数据表示

在计算机中,只有01序列,这串01序列是什么意思,由人为定义。

西文字符

在ASCII码中,通过一个65的偏移量,使得一部分无符号数指向A-Za-z。
在C语言中,通过char类型的转换规范,可以将对应的01序列转换为英文输出。

GB2312-80

需要了解三种码之间的关系:区位码、国标码、机内码
国标码=区位码+2020H
机内码=区位码+8080H
区位码该怎么求呢?加就完了!
区是从A1开始的:第1区就是A1,第2区就是A2…第N区就是(A0+N)H
位也是从A1开始的:第1个字就是A1,第2个字就是A2…第N个字就是(A0+N)H
区位码就是区和位拼接。
比如知道了“啊”字位于第16区第1位,那么就能得到它的区位码为B0A1H

字模点阵

如果人为指定了某个01串对应的文字含义。那么如何显示出来呢,就需要用到字库。
需要提前将字形存在机内。不同字体对应不同的字库,从字库中找到字形描述信息,然后送设备输出。
通过在字库中的位置找相应的字形信息。

大端存储和小端存储

在之前“码值”的博客中,对数据存储留了个坑。
image.png
给变量a赋值0x123456,结果在内存中存储的是0x56341200
这是因为,当前编译器,采用的是“小端存储”。
比如这道题:某计算机字长为32位,按字节编址,采用小端(Little Endian)方式存放数据。假定有一个double型变量,其机器数表示为1122 3344 5566 7788H,存放在0000 8040H开始的连续存储单元中,则存储单元0000 8046H中存放的是22H
如果是按十六进制顺序存贮,如0x00123456,此时为大端存储。
也就是说:

  • 小端存储的时候,数据的表示和存储顺序是相反的。也就是低位在前。
  • 大端存储的时候,数据的表示和存储顺序是相同的。也就是高位在前。

上面的例子给人的感觉不是很直观:0x12345656在前,为什么还是小端?
这是因为,56在写数字的时候,是在低位的位置上,越往左,位权越大。

大端小端各自的优点

  • 小端方式强制类型转换不需要调整
  • 大端容易判断正负

小端是将低位放在低地址,高位放在高地址。在发生类型转换时,丢失的是高位的数据。因此小端方式存储,只需要知道首地址,向后裁剪或扩充就可以。
大端是将高位放在低地址,低位放在高地址。有符号数的最高位是符号位。如果采用大端存储,只需要知道首地址指向的值,也就是知道了最高位的符号位。

存储方式检测

上面的配图直接截自Clion。
在C语言中可以利用联合检测。

union A{int a;char b;
};
union A a;
a.a=0x123456;
printf("%hhx",a.b);

利用联合,对a赋值。
然后利用b去除第一个字节部分的值。
image.png

内存对齐

创建一个结构体,在里面定义各种变量,变量的定义顺序会影响结构体最终占用的空间。

#include "stdio.h"struct A {char name[20];  //20  16+4int age;        //4   4+上面的4double score;   //8   8
};
struct B {char name[20];  //20  16+4 补4double score;   //8int age;        //4   补4
};
struct AB {struct A a;struct B b;
};
struct BA {struct B b;struct A a;
};int main() {struct A a;struct B b;struct AB ab;struct BA ba;printf("A的大小=%d\n", sizeof(a));printf("B的大小=%d\n", sizeof(b));printf("AB的大小=%d\n", sizeof(ab));printf("BA的大小=%d\n", sizeof(ba));return 0;
}

上面代码的运行结果:
image.png
有如下要点:

  • 字符可以拆分
  • 字符可以和整形变量合并
  • 结构体内嵌套结构体,占用空间不变:结构体本身已经进行了内存对齐

考虑内存对齐,只需要考虑基本数据类型的对齐。
尽量把大的内存放到后面写。
联合体中各个变量共用同一段内存。选中占用空间最大的变量对齐。

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

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

相关文章

算法萌新闯力扣:同构字符串

力扣题:同构字符串 开篇 对于字符串相关的题目,哈希表经常会使用到,这道题更是如此,还用到了两个哈希表。拿下它,你对字符串题目的理解就会更上一层楼。 题目链接:205.同构字符串 题目描述 代码思路 看完题目后&a…

C语言--五子棋项目【图文详解 经典】

今天小编带领大家学一学C语言入门必写的五子棋项目,题目非常经典,值得一学。 目录 一.目标效果 二.五子棋的元素 1.棋子 2.棋盘 三,需要准备的工具 四.具体内容 1.加载背景图片 2.画横线与竖线 3. 画小黑点 4.获取鼠标消息 5.画棋子 6.如何判断比…

【ERROR】ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND No package.json

1、报错 启动项目的时候,报这个错误,是因为根目录错误,查看,根目录是否错误。

Bobo Python 学习笔记

安装 Bobo 可以通过通常的方式安装,包括使用setup.py install 命令。当然,您可以使用Easy Install、Buildout或pip。 安装bobo Collecting boboDownloading bobo-2.4.0.tar.gz (17 kB) Collecting WebObDownloading WebOb-1.8.7-py2.py3-none-any.whl…

Python爬取股票交易数据代码示例及可视化展示。

文章目录 前言一、开发环境二、第三方模块三、爬虫案例步骤四、爬虫程序全部代码1.分析网页2.导入模块3.请求数据4.解析数据5.翻页6.保存数据 五、实现效果六、数据可视化全部代码1.导入数据2.读取数据3.可视化图表4.效果展示关于Python技术储备一、Python所有方向的学习路线二…

创建一个前后端分离项目:Vue+SpringBoot

这是一个基于SpringBootVue3的前后端分离的项目,麻雀虽小,五脏俱全,开箱即用! 这先粗略描述一下它的前后端。JNPF开发平台的前端采用的是Vue.js,这是一种流行的前端JavaScript框架,用于构建用户界面。 后端…

第三方软件测试服务有哪些形式?选择时如何避雷?

高新技术的快速发展,人们对于软件产品越来越依赖,因此软件质量对于软件企业来说至关重要。产品质量的好坏需要通过检测才得知,软件企业为了获得更客观公正的检验结果,会将软件测试交由第三方软件测试服务机构进行?那么有哪些形式…

【milkv】0、duo编译环境搭建

一、开发资料整理 Docker https://hub.docker.com/repository/docker/dreamcmi/cv1800-docker/general GitHub https://github.com/milkv-duo/duo-buildroot-sdk CV181x/CV180x MMF SDK 开发文档汇总 https://developer.sophgo.com/thread/471.html cv181x芯片使用的交叉…

盘点72个ASP.NET Core源码Net爱好者不容错过

盘点72个ASP.NET Core源码Net爱好者不容错过 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 链接:https://pan.baidu.com/s/1nlQLLly_TqGrs5O8eOmZjA?pwd8888 提取码:8888 项目名称 (Chinese) 物业收费…

【git】解决git报错:ssh:connect to host github.com port 22: Connection timed out 亲测有效

如题,git使用中突然报错 ssh:connect to host github.com port 22: Connection timed out 通过查阅各种资料,得知原因可能是由于电脑的防火墙或者其他网络原因导致ssh连接方式 端口22被封锁。 解决方法 一:抛弃ssh连接方式,使…

图解系列--密码

1.概念 _1.对称密码与公钥密码 对称密码是指在加密和解密时使用同一密钥的方式。 公钥密码则是指在加密和解密时使用不同密钥的方式。因此,公钥密码又称为非对称密码。 _2.混合密码系统 对称密码和公钥密码结合起来的密码方式 _3.散列值 散列值就是用单向散列函数计…

使用c++程序,实现图像平移变换,图像缩放、图像裁剪、图像对角线镜像以及图像的旋转

数字图像处理–实验三A图像的基本变换 实验内容 A实验: (1)使用VC设计程序:实现图像平移变换,图像缩放、图像裁剪、图像对角线镜像。 (2)使用VC设计程序:对一幅高度与宽度均相等的…

LOWORD, HIWORD, LOBYTE, HIBYTE的解释

文章目录 实验结论 实验 int 类型大小正常为4Byte 以小端序来看 0x12345678在内存中的存储为 0x78 0x56 0x34 0x120x78在低地址&#xff0c;0x12在高地址 程序输出 #include <stdio.h> #include <string.h> #include<windows.h>int main() {int a 0x12345…

创信短信API的无代码开发集成:电商平台、CRM和用户运营

无代码开发&#xff1a;集简云与创信短信API的连接 创信短信API的无代码开发集成&#xff0c;旨在为电商平台、CRM和用户运营提供便利。作为一款超级软件连接器&#xff0c;集简云可以在无需开发&#xff0c;无需代码知识的情况下&#xff0c;轻松连接创信短信与近千款软件系统…

​Unity Vuforia 新手(图片识别)教程,后续整理 实体识别 详细流程

文章目录 前言一、Vuforia是什么&#xff1f;二、Unity导入Vuforia1.去Unity - Windows – Asset Store&#xff0c;搜vuforia engine&#xff0c;添加到我的资源2.打开package Manager&#xff0c;导入到工程中即可3.或者在vuforia engine官网下载的Unity包导入4.检查是否导入…

Git相关: 拉取、git push提交 过程遇到的错误

目录 解决git push报错error: RPC failed; HTTP 413 curl 22 关于这个问题&#xff0c;其实千万别用gitlab,因为你怎么推送 也不可能把几G的文件推上去。 error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 se 解决git push报错error: RPC failed;…

夯实c语言基础

题干以下关于函数的叙述中正确的是&#xff08;  d &#xff09;。   A.函数调用必须传递实参   B.函数必须要有形參   C.函数必须要有返回值   D.函数形参的类型与返回值的类型无关 题干以下程序实现&#xff0c;打印任意奇数行菱形星塔&#xff0c;请填空。 void…

Python交易-通过Financial Modeling Prep (FMP)选择行业

介绍 在您的交易旅程中,无论您是在寻找理想的股票、板块还是指标,做出明智的决策对于您的成功至关重要。然而,收集和分析所需的大量数据可能相当艰巨。财务建模准备 (FMP) API的

vue3实现数据大屏内数据向上滚动,鼠标进入停止滚动 vue3+Vue3SeamlessScroll

1.效果图 2.npm下载依赖及main.js文件配置 npm install vue3-seamless-scroll --saveimport vue3SeamlessScroll from vue3-seamless-scroll;app.use(vue3SeamlessScroll) 3.html代码 <!-- scrollFlag为true时再渲染,vue3只要涉及到传值子页面需要加flag判断&#xff0c;否…