408学习笔记-14-C-数据在内存中的存储

1、整数型存储

整数型存储就是所有整型家族里的数据类型的存储方式,也就是说包含了字符类型的存储(因为字符的''操作符的返回值是ASCII码值,故实际上存储的是整数)。



1.1、有符号整数

有符号整数包含charshortintlonglong long这几种类型的数据。

他们的二进制表示方法有三种:原码,反码,补码。

这三种表示方法均有符号位数值位两部分,符号位都是用0表示,用1表示,最高位的一位是被当做符号位,剩余的都是数值位。

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。

正整数的原、反、补码都相同;负整数的三种表示方法各不相同。

有符号整数在内存中统一以补码的形式存储,并且以补码形式参与任何操作。

以补码形式进行存储的原因:
在计算机系统中,有符号数值一律用补码来表示和存储。

原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。



1.2、有符号整数的特性

由于补码与数据类型限制精度的特性,产生了一种有意思的循环:
char类型为例子:

-128,-127…-2,-1,0,1,2…126,127,-128,-127…-2,-1,0,1,2…126,127,-128,-127…

总结为:阳极生阴,阴极生阳(有点模运算的感觉在里面)。



1.3、无符号整数

无符号整数包含unsigned charunsigned shortunsigned intunsigned longunsigned long long这几种类型的数据。

无符号数中没有原码-反码-补码的概念。

无符号整数的二进制表示形式只有一种,即直接将无符号整数翻译成对应的二进制形式,并且以这种形式在内存中存储。



1.4、无符号整数的特性

由于数据类型限制精度的特性,也产生了一种有意思的循环:
char类型为例子:

0,1,2…126,127,128…254,255,0,1,2…126,127,128…254,255,0,1,2…126,127,128




2、浮点数型存储

使用浮点数型存储的数据类型有:floatdoublelong double

浮点型数存储也就是IEEE 754标准。



根据IEEE 754标准,任何一个二进制浮点数V可以表示成下面的形式:

V = ( − 1 ) S ∗ M ∗ 2 E V=(-1)^S*M*2^E V=(1)SM2E

其中:

( − 1 ) S (-1)^S (1)S:表示符号位,当S=0,V为正数;当S=1,V为负数。

M M M:表示有效数字,M取值范围是大于等于1,小于2。

2 E 2^E 2E:表示指数位。

IEEE 754标准的表示规则可总结为:

1、十进制浮点数转换为二进制浮点数。

2、用科学计数法表示此二进制浮点数。

3、表示为IEEE 754格式。



IEEE 754标准的存储规则是:

IEEE 754格式中的 S S S M M M E E E分别提取出来,并且对 M M M E E E进行处理后(对 S S S不做处理),得到:符号码S、尾数码M、阶码E



M M M的处理:
前面说过,1≤ M M M<2,也就是说, M M M可以写成1.XXXXXX的形式,其中XXXXXX表示小数部分。IEEE 754规定,在计算机内部保存 M M M时,默认这个数的第一位总是1,因此 M M M整数位的1需要被舍去,只保存后面的XXXXXX部分,得到尾数码M

比如 M M M1.01的时候,只保存01,等到读取的时候,再把整数位的1补回去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给尾数码M只有23位,将整数位的1舍去以后,等于可以保存24位有效数字。



E E E的处理:

首先,将 E E E转换为二进制数据。

IEEE 754标准规定,处理后得到的阶码E是一个无符号整数(unsigned int)。这意味着,如果阶码E8位,它的取值范围为0~255;如果阶码E11位,它的取值范围为0~2047

但是,我们知道,科学计数法中的 E E E是可以出现负数的,所以IEEE 754规定, E E E必须再加上一个偏移量来变成一个非负数,也就是阶码E。对于8位的 E E E,这个偏移量是127;对于11位的 E E E,这个偏移量是1023

比如, 2 10 2^{10} 210 E E E10,所以在保存为32位浮点数时,必须对 E E E进行处理得到阶码E10+127=137,即10001001

注意:以float类型为例,值为-127128的这2个 E E E有特殊用途,一般不在正常的 E E E讨论范围(-126~127)内,他们的阶码E分别是:
-127-01111111 + 01111111 = 00000000
12810000000 + 01111111 = 11111111



在得到最终的符号码S、尾数码M、阶码E后,按照以下规则将它们连接在一起,得到最终的浮点数型存储的二进制数据:

IEEE754标准规定:

对于32位的浮点数(float类型),最高的1位存储符号码S,接着的8位存储阶码E,剩下的23位存储尾数码M
在这里插入图片描述
对于64位的浮点数(double类型),最高的1位存储符号码S,接着的11位存储阶码E,剩下的52位存储尾数码M在这里插入图片描述
对应例子(十进制浮点数5.5float类型变量进行存储):

1、转换为二进制浮点数: 101.1 101.1 101.1

2、科学计数法表示为: 1.011 ∗ 2 2 1.011*2^2 1.01122

3、IEEE 754格式: V = ( − 1 ) 0 ∗ 1.011 ∗ 2 2 V=(-1)^0*1.011*2^2 V=(1)01.01122

4、经过处理后得到:符号码S0;尾数码M0110000 00000000 00000000;阶码E10000001

5、连接得到最终用于存储的二进制数据:0 10000001 0110000 00000000 00000000

验证:
在这里插入图片描述



3、浮点数型读取过程

从内存中读取浮点数型的二进制数据时,根据阶码E的不同,可以分为三种情况:



3.1、阶码E不全为0也不全为1(通常情况)

此时就直接使用浮点数型存储的逆过程(以float类型为例):

1、将存储的32位二进制数据切割为:1位的符号码S,8位的阶码E,23位的尾数码M

2、将阶码E减去偏移量127,还原为 E E E;将尾数码M补上小数点.和整数位的1,还原为 M M M。(符号码S没有还原过程,直接就是 S S S)。

3、根据IEEE 754格式: V = ( − 1 ) S ∗ M ∗ 2 E V=(-1)^S*M*2^E V=(1)SM2E得到科学计数法的二进制浮点数。

4、最后将二进制浮点数转换为十进制浮点数。



3.2、阶码E全为0

float类型为例:

1、将存储的32位二进制数据切割为:1位的符号码S,8位的阶码E,23位的尾数码M

2、将阶码E减去偏移量127,还原为 E E E,可是由于 E E E-127过于小,能够预测到最终的结果是一个非常小的数字,此时的尾数码在补上小数点.且在整数位补0而不是补1,并且让 E E E+1。这样做的目的是为了表示一个无限接近于±0的数字,也就是: ± 0. x x x x x x x ∗ 2 − 126 \pm0.xxxxxxx*2^{-126} ±0.xxxxxxx2126

3、所以直接规定:阶码E全为0,表示浮点数无限接近于 ± 0 \pm0 ±0。(由于编译器输出浮点数时的精度限制,会输出为0.000000



3.3、阶码E全为1

与以上同理:

阶码E全为1,表示浮点数无限接近于 ± ∞ \pm\infty ±




4、浮点数型存储的精度丢失

浮点数型存储有一个天生的缺点:可能发生精度丢失。

根本原因就是:在数学上,有限的十进制数字的二进制形式可能是无限的。

故而某些浮点数是无法精确保存的。

详见文章:C语言中数据类型的规格与截断、补长

并且衍生出一个浮点数比较的结论:如果两float类型数据的差值小于最小精度位(小数第六位),则这两个数据相等。详见:浮点值的比较




4、大小端字节序存储

我们知道,变量与变量在内存中的存储顺序是由定义顺序与所处内存区域决定(例如在主函数中先后定义ab两个变量,由于这两个变量存放在栈区,故a变量存放于高地址,b变量存放于低地址),这是变量与变量之间的存储顺序。

大小端字节序存储指的是单个变量内部,字节与字节之间的两种存储顺序。

大端字节序存储指的是:
单个数据内部,数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容保存在内存的低地址处。

小端字节序存储指的是:
单个数据内部,数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容保存在内存的高地址处。

有大小端模式之分的原因:

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

例如:一个16bitshort型变量x,在内存中的地址为0x0010x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址0x0010中,0x22放在高地址0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARMDSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

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

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

相关文章

如何做接口测试?

今天来聊聊接口测试&#xff0c;现在是2024年了&#xff0c;打开招聘网站随便点开一个招聘帖子&#xff0c;几乎都可以看到岗位JD要求写着有接口测试经验优先。其重要性可见一斑&#xff01; 目前&#xff0c;凡是好一点稍具规模的公司哪怕是大厂外包也几乎都要求会接口测试&a…

QT(6.5) cmake构建C++编程,调用python

一、注意事项 explicit c中&#xff0c;一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数)&#xff0c;承担了两个角色&#xff0c;构造器、类型转换操作符&#xff0c; c提供关键字explicit&#xff0c;阻止转换构造函数进行的隐式转换的发生&#…

使用Docker搭建YesPlayMusic网易云音乐播放器并发布至公网访问

目录 ⛳️推荐 1. 安装Docker 2. 本地安装部署YesPlayMusic 3. 部署公有云YesPlayMusic播放器 3.1 安装cpolar内网穿透 3.2 固定YesPlayMusic公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一…

【区间、栈】算法例题

目录 六、区间 48. 汇总区间 ① 49. 合并区间 ② 50. 插入区间 ② 51. 用最少数量的箭引爆气球 ② 七、栈 52. 有效的括号 ① 53. 简化路径 ② 54. 最小栈 ② 55. 逆波兰表达式求值 ② √- 56. 基本计算器 ③ 六、区间 48. 汇总区间 ① 给定一个 无重复元素 的 …

LeetCode # 199. 二叉树的右视图

199. 二叉树的右视图 题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3…

大规模电商平台数据采集难点分析♫

▁▃▅▇主要包括以下几方面&#xff1a; API工具 ◆◆数据量巨大 任何系统&#xff0c;在不同的数据量面前&#xff0c;需要的技术难度都是完全不同的。 如果单纯是将数据采到&#xff0c;可能还比较好完成&#xff0c;但采集之后还需要处理&#xff0c;因为必须考虑数据的规…

如何根据业务需求选择合适的电子合同平台?

在数字化转型的浪潮中&#xff0c;电子合同已经成为企业运营中不可或缺的一部分。然而&#xff0c;面对市场上众多的电子合同平台&#xff0c;企业如何根据自身的业务需求做出合适的选择呢&#xff1f;本文将为您一一解答。 在电子合同的签署过程中&#xff0c;数字证书颁发机…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(日历选择器弹窗)

点击日期弹出日历选择器弹窗&#xff0c;可选择弹窗内任意日期。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文&#xff0c;不可在UI上下文不明确的地方使用&…

nodejs 常用命令

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;常用于服务器端编程。以下是一些 Node.js 的常用命令 1、安装 Node.js&#xff1a; 通常&#xff0c;你会从 Node.js 的官方网站下载并安装适合你操作系统的版本。安装完成后&#xff0c;你可以在命令行中…

跨域以及跨域配置

1、什么跨域 首先&#xff0c;在前后端没有分离项目&#xff0c;例如jsp、php&#xff0c;前后台代码没有实现物理上的分离。不存在跨域问题。前后端分离后&#xff0c;前后端的地址域名不同&#xff0c;而同源策略导致浏览器会拦截a地址访问b地址请求&#xff08;a地址通过浏览…

【前端】Web Audio API接口介绍

简言 记录下Web Audio API接口的介绍。 Web Audio API 提供了在 Web 上控制音频的一个非常有效通用的系统&#xff0c;允许开发者来自选音频源&#xff0c;对音频添加特效&#xff0c;使音频可视化&#xff0c;添加空间效果&#xff08;如平移&#xff09;&#xff0c;等等。 …

Obsidian插件PicGo-图床创建使用[腾讯云保姆级教程]

一、下载PicGo并配置 1&#xff1a;安装插件 首先插件市场搜索picgo会出现Image auto upload&#xff0c;这个就是PicGo安装此插件并启用即可 2&#xff1a;安装PicGo软件 打开此链接&#xff1a;https://github.com/Molunerfinn/PicGo 自己选择一个方式下载&#xff0c;我…

数字乡村发展策略:科技引领农村实现跨越式发展

随着信息技术的迅猛发展和数字经济的崛起&#xff0c;数字乡村发展策略已经成为引领农村实现跨越式发展的重要手段。科技的力量正在深刻改变着传统农业的生产方式、农村的社会结构以及农民的生活方式&#xff0c;为农村经济发展注入了新的活力和动力。本文将从数字乡村的内涵、…

第十四届蓝桥杯JavaB组省赛真题 - 幸运数字

进制转换可以参考如下的十进制&#xff0c;基本一样的&#xff0c;只是把10变成了其他数字&#xff0c; sum就是各个数位之和 public static int myUtil(int n) {int sum 0;while(n > 0) {sum n % 10;n / 10;}return sum;} 注意&#xff1a; 如果写在同一个类里面&…

苍穹外卖-day15:套餐管理

套餐管理 课程内容 套餐分页查询启售停售套餐删除套餐新增套餐 1. 套餐分页查询 1.1 需求分析和接口设计 根据产品原型来了解需求&#xff0c;套餐分页查询的产品原型如下&#xff1a; 业务规则&#xff1a; 根据页码展示套餐信息(套餐名称、套餐图片、套餐分类、价格、售…

4.1.1 SN74HC05N型反相器(OD门)

1、OD门介绍 为提高逻辑门驱动负载的能力,输出端漏极开路的OD门被广泛使用。使用时,OD门需外接一只电阻上拉到电源正极。相同型号的OD门可以进行多只并联,实现“线与”的逻辑功能。 常用的OD门芯片有74HC05N、I2C设备等。 2、SN74HC05N型反相器(OD门) 2.1 引脚分布和功…

Java中的并发并行与生命周期

并发并行与生命周期 并发、并行什么是进程并发的含义并行的理解多线程是如何在执行 线程的生命周期Java线程的状态线程的6中状态互相转换 并发、并行 什么是进程 正在运行的程序&#xff08;软件&#xff09;就是一个独立的进程线程是属于进程的&#xff0c;一个进程中可以同…

全网最全的Postman接口自动化测试(史实级攻略)

软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;【持续更新最新版】-CSDN博客 背景 该篇文章针对已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念…

2024年Jira全面解析:从 Jira 的概念到优缺点、最新政策

Jira是澳大利亚的Atlassian公司开发的一款项目管理软件&#xff0c;名字来源于日文中“哥斯拉”的称呼“Gojira”。Jira不仅可以追踪缺陷和问题&#xff0c;还能管理项目。很多企业还将JIRA用于一些特殊的场景&#xff0c;比如作为仓库自动化工具、管理文档流程、优化费用等等。…

四川易点慧电子商务抖音小店:安全可靠,购物新选择

在数字化浪潮席卷全球的今天&#xff0c;电子商务已成为人们生活中不可或缺的一部分。四川易点慧电子商务抖音小店作为新兴的电商平台&#xff0c;以其安全可靠、便捷高效的特点&#xff0c;逐渐赢得了广大消费者的青睐。今天&#xff0c;就让我们一起走进四川易点慧电子商务抖…