数据在内存中的存储

 

目录

简介数据在内存中的存储方式

整形

有符号整形(signed)

无符号整形(unsigned)

原码、反码、补码

大端小端

整形提升

数据截断

 浮点数在内存中的存储

S、E、M

S

M

E

double和float的存储模型 


简介数据在内存中的存储方式

在讨论数据在内存中的存储方式之前,我们需要先确定一个概念,数据存储在内存中的基本单位是字节

c语言类型分类如图:

一、 自定义类型不在我们讨论范围之内

原因是:自定义类型是由用户来定义的,用户定义的不同,它存储的大小就不同,它并不是固定的

二、指针类型我们不重点说明

原因是,所有的指针存储的都是一个地址,在32位机器下它是占用四个字节,在64位机器下它是占用8个字节

指针一句话概括:我们可以把指针看作一个整形类型,但里面存储的一定是一个地址,指针的大小取决于你地址的长度!

那么现在让我们看看内置类型中整形浮点型

整形

所有的整形家族中,都分为无符号的整形(unsigned)和有符号的整形(signed)

默认情况下如果我们不显式写signed/unsigned,默认是signed

注意:这一点char类型有点特殊,在c语言标准中没有说明char类型默认是signed/unsigned,这个是由不同的编译器实现的。

把一个小于int的类型(char/short)写在表达式计算/通过整形输出的时候,就会发生整形提升的概念

把一个较大类型存储在比他小的类型当中时,那么就会发生数据截断的概念

注意:这里的大小指的是开辟空间的大小,也就是所占字节的个数大小!

有符号整形(signed)

在我们进行数据存储时,二进制的有符号整形通常最高位是表示正/负的

如果数值为正数,那么最高位则为0,反之则为1,这个最高位我们叫做符号位,其他的我们叫做数值位,所谓有符号的整形可以理解为有正负之分的整形。

注意:虽然有符号的整形存储在内存中的最高位是用来表示正负的,但在进行计算时,符号位也还是会用来计算

signed表示的就是有符号的整形

无符号整形(unsigned)

所谓的无符号整形我们可以理解为:在有符号的整形的基础上把最高位的符号位转化为数值位。我们可以想象,如果没有了符号位,这个数就永远 ≥ 0

原码、反码、补码

学习了前面的有符号和无符号,相信我们对于一个正负数怎么区分也有了一个概念

接下来请思考一下:

-2+1=?

-2的二进制序列: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 

1 的二进制序列: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 1

-2+1 =  1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 = -3

可以看到,结果似乎并不正确!

同样的,科学家也有跟我们一样的疑惑,负数的+好像并不正确

其实上面的序列我们写的是两个原码序列,由上可以看出原码序列不能直接用来存储 

于是就出现了反码,反码的定义是正数不变,负数符号位不变其他位按位取反

再来看看上面的问题

-2的二进制反码: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1

1 的二进制反码: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 1

-2+1 = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0

符号位不变其他位按位取反:

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1=-1

 我们惊喜的发现好像就成功了,事情就这么简单吗?

显然不是,不然标题就取原码、反码就可以了,要补码干嘛

我们再看看-1+1,按照上面的方法再取一遍试试

-1的二进制反码 = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0

1 的二进制反码 =  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 1

-1+1 = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

符号位不变其他位按位取反

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 = -0

由于-0和0是一个数却对应了两个二进制序列,这不符合二进制的唯一性,于是反码也不能用来计算了,但我们发现上面的反码在某些特殊情况下才会出现错误

于是科学家在反码的基础上改造出了二进制补码,这也是最终整形在内存中存储的方案

补码的定义是:负数的补码在反码的基础上+1,正数还是不变

我们再计算一下上面的-1+1

-1的二进制补码 = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1的二进制补码 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 1

-1+1 = 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 0

可以看到由低位到高位第33位是1,默认的整形只能存储32位所以第33位没有存储进来,最终

-1+1 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 = 0

高位为0,补码=原码

结果正确

补码最妙的地方是他能依靠一套逻辑硬件完成这一整套过程(获取补码和转化为原码) 

 原码 = 补码取反+1

 补码 = 原码取反+1

这里大家不妨试试!

大端小端

大端和小端就是计算机在存储数据时的顺序问题!

大端和小端顺序问题的基本单位是字节,即1个字节的类型(char)不存在大端和小端之分

大端:计算机存储数据时低地址存储高位数据,高地址存储低位数据

小端:计算机存储数据时低地址存储低位数据,高地址存储高位数据

如:1 = 00000000000000000000000000000001

此处最右边为最低位,最左为最高位

“1”在小端机中存储:

←低地址                                        高地址→

0x01 00 00 00(16进制) 

“1”在大端机中存储

0x00 00 00 01(16进制)

为什么会出现大小端?

在以前人们在定数据存储的时候有许多许多的存储方式,而数据怎么存其实不重要,只要能存进去后拿出来即可,也就出现了各种各样的存储方式,最终筛选出来的就两种,大端和小端

因为这两种是最好取出来的方式!

验证机器大小端:

思路:我们只需要固定一个变量=1,再取出地址,使用char*指向这个地址,再解引用一次访问一个字节,而高字节如果是0就是大端,是1即为小端

#include<stdio.h>

bool CheckPort()
{
    int a = 1;
    return *(char*)&a;
}


int main()
{
    printf("%d",CheckPort());
    return 0;
}

整形提升

把一个小于int的类型(char/short)写在表达式计算/通过整形输出的时候,就会发生整形提升的概念

整形提升:

1、有符号的整形:

        如果转化为二进制不满足32位且符号位为0,那么就在符号位补0,补够32位为止

        如果转化为二进制不满足32位且符号位为1,那么就在符号位补1,补够32位为止

2、无符号的整形:

        如果转化为二进制不满足32位,则在高位补0,补够32位为止

为什么会发生整形提升?

因为表达式计算和整形输出时,要把这个数据放到cpu的相关整形运算器中,而一般整形运算器的标准都是4字节的倍数,且寄存器大多也是4字节的倍数,如果我们要两个char之间进行运算,消耗是很大的,而整形提升则可以把所有类型的整形都转化为统一的4字节进行处理,那么就用一套相关整形运算器完成了所有类型的统一计算!

如下代码

#include<stdio.h>

int main()
{
    char a = -128;
    //a原码 = 110000000;
    //a反码 = 101111111;
    //a补码 = 110000000;
    //因为a是char类型的所以a里面最多存储一个字节,那么最高位的1就被丢了
    //最终a存储 = 10000000
    printf("%u",a);
    //此处要输出a,发生整形提升,高位是1
    //最终输出二进制为:11111111111111111111111110000000 的数
    return 0;
}

数据截断

数据截断其实在前面的内容中也发生过很多次了,数据截断是一个较小的类型存储一个较大的类型时发生的,例如char类型存储int类型的值

规则:从低位开始取,取出的数据大小与较小类型大小相同,而多出来的数据直接丢弃

例如:

0x11 22 33 44 要存储在一个char类型里

char类型所占空间为一个字节,那么取出数据中的最低位一个字节

则char类型中存储的就是0x44

 浮点数在内存中的存储

S、E、M

根据IEEE5(电气电子工程师协会)标准规定:浮点数在内存中的存储的是SEM

无论哪一个浮点数的在内存中表示形式都能转化为:(-1)^S * M * 2^E

可以看到,此表达式中变量为S、M、E,也就是只要我们知道了S、M、E就能还原出一个浮点数

注意:浮点数在内存中存储的时候小数点后面的数通常转化为2^x,x<0

例1:

“6.5”转化为二进制后

错误:110.101(小数点后的数不能用二进制整形的形式表示)

正确:110.1(解读为:2^2 + 2^1 + 2^-1)

例2:

"7.625"转化为二进制后

111.101(解读为:2^2 + 2^1 + 2^0 + 2^-1 + 2^-3)

S

S可以用来表示一个浮点数的正负,他只有为0和1两种形式

如果S = 0,那么-1的0次方即为1,那么这个浮点数即为正数

如果S = 1,那么-1的1次方即为-1,那么这个浮点数即为负数

M

M指的是浮点数的有效数据,这个数据是>=1 && < 2 的,再取出这个数的小数位即为M

例如

"6.5"转化为二进制后为110.1

我们把他转化为 >=1 && <2的数据后(小数点要左移两位)

1.101

而此处的有效数据即为1.101

M存储的就是这个小数点右边的数据(101)

注意:M只存储小数点后的数据的原因是因为这个数据的小数点左边一定是1,那么我们就不用存储固定的值,在取出这个M后自动在前面补上一个1就可以了

E

E指的是,在我们把浮点数的数据转化为 >=1 && <2 后移动的位数,再+中间值后即为E

左移为正,右移为负

如果我们把这个数左移了两位,那么真实E = 2

如果我们把这个数右移了两位,那么真实E = -2

中间值:在存储浮点数时表示E的类型通常为无符号的,E却可能为负,这时的解决办法就是加上中间值让他正数和负数都存储成正数,最后当我们要取出数据时直接减去中间值就得到了它的真实值

float:因为在float中存储E的空间为8个bit位,且无符号(范围0-255),标准规定这个中间值为127,也就是所有的float类型中存储的E都是加上了127,真实E为存储的E-127

double:double类型中,E的存储空间为11个bit位,也是无符号的(范围0-2047),标准规定这个中间值为1023,也就是所有的float类型中存储的E都是加上了1023,真实E为存储的E-1023 

double和float的存储模型 

好啦,今天的内容就到这啦,感谢大家的支持,我们下期再见

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

类脑计算讲解

当前&#xff0c;人工智能的发展有两个主要路径&#xff0c;一个是沿计算机科学发展而来的深度学习途径&#xff0c;另一个是沿着模仿人脑发展而来的类脑计算途径。 类脑计算途径 这个方向是以模拟人脑神经网络计算为基础而发展出的一种新型芯片&#xff0c;通过模拟神经元和…

在线教育机构的视频如何做防下载和防盗录?

在线教育平台付费课程、企业内训的培训课程&#xff0c;这类视频课程内容是如何做防下载和防盗录的&#xff1f; 1.AI隐形溯源水印 这个功能能够将水印隐藏在视频中&#xff0c;不会影响观看体验&#xff0c;但却能够帮助企业很好的视频版权保护。更重要的是&#xff0c;对于盗…

【优化调度】基于改进遗传算法的公交车调度排班优化的研究与实现(Matlab代码实现)

目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 本文对当前公交企业调度系统进行了分析&#xff0c;建立了公交排班的数学模型。本文基于数据挖掘分析的结果上&#xff0c;使用截面客流量数据对模型进行约束&#xff0c;得出了公交客流出行的空间分布规律。再以…

ShareX_一款好用的截图工具安装- Window

择心】向大家介绍and安装ShareX ShareX 免费、开源、轻量多区域截图无缝处理截图屏幕录制、文件共享各种实用工具&#xff08;如拾色器&#xff0c;屏幕拾色器&#xff0c;尺子&#xff0c;图像编辑器&#xff0c;图像合并&#xff0c;图像分割器&#xff0c;生成图像缩略图&am…

三波混频下的相位失配原理

原理推导 在四波混频情况下&#xff0c;实现零相位失配是一件很困难的事情。因为在四波混频中&#xff0c;相位调制和增益都依赖于相同的参数&#xff0c;即克尔非线性 γ \gamma γ。这个问题可以用嵌入在传输线上的辅助共振元件的复杂色散工程来部分解决。 但是在三波混频中…

离散数学_十章-图 ( 5 ):连通性 - 上

&#x1f4f7;10.5 图的连通性 1. 通路1.1 通路1.2 回路1.3 其他术语 2. 无向图的连通性2.1 无向图的连通与不连通2.2 定理2.3 连通分支 3. 图是如何连通的3.1 割点&#xff08; 关节点&#xff09;3.2 割边&#xff08; 桥&#xff09;3.3 不可分割图3.4 &#x1d458;(&#…

华为OD机试真题 Java 实现【跳格子2】【2023 B卷 100分】,附详细解题思路

一、题目描述 小明和朋友玩跳格子游戏&#xff0c;有n个连续格子组成的圆圈&#xff0c;每个格子有不同的分数&#xff0c;小朋友可以选择从任意格子起跳&#xff0c;但是不能跳连续的格子&#xff0c;不能回头跳&#xff0c;也不能超过一圈。 给定一代表每个格子得分的非负整…

3.9 流水作业调度问题

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.我对流水调度问题的理解 流水作业调度问题是动态规划中的一个经典问题&#xff0c;它涉及将一系列作业分配给多个工作站以最小化总完成时间。该问题的…

练习:有限状态机测试

练习&#xff1a;有限状态机测试 1 FSM 示例 在练习中&#xff0c;我们将使用两个 FSM。 两者都有输入字母 X {a, b} 和输出字母 Y {0,1}。 第一个 FSM 将称为 M1 并由以下有向图表示。 对于上面给出的每个 FSM Mi&#xff1a; 1.确定以下值&#xff0c;显示您的工作。 (a…

内存对齐原则

struct &#xff08;1&#xff09;结构体第一个数据成员放在offset为0的地方&#xff0c;后面每个成员相对于结构体首地址的偏移量&#xff08;offset&#xff09;都是成员大小&#xff08;该变量类型所占字节&#xff09;的整数倍&#xff0c;如有需要编译器会在成员之间加上填…

非煤矿山电子封条系统算法方案 opencv

非煤矿山电子封条系统算法部署方案是基于pythonopencv网络模型Ai视频图像识别技术&#xff0c;非煤矿山电子封条系统算法部署方案对出入井人员、人员变化及非煤矿山生产作业状态等状况&#xff0c;及时发现处理异常动态将自动发出警报。OpenCV的全称是Open Source Computer Vis…

研报精选230528

目录 【行业230528华金证券】传媒行业深度研究&#xff1a;AIGC最新应用与场景研究 【行业230528国海证券】电动船舶行业深度报告&#xff1a;绿色智能大势已至&#xff0c;驶向电化百亿蓝海 【行业230528华西证券】纺织服装行业周报&#xff1a;5月增长放缓无碍中长期出清逻辑…

Vue.js 中的过滤器和计算属性

Vue.js 中的过滤器和计算属性 Vue.js 是一款流行的 JavaScript 框架&#xff0c;它提供了一种简单而灵活的方式来构建交互式 Web 应用程序。在 Vue.js 中&#xff0c;过滤器和计算属性是两个常用的概念。它们可以帮助开发者更方便地处理数据&#xff0c;提高代码的可读性和可维…

【Linux】进程状态与进程优先级

目录 一、什么是进程二、进程状态1、Linux下的进程状态2、两个特殊进程1、僵尸进程2、孤儿进程 三、进程优先级 一、什么是进程 进程就是程序的一个执行实例&#xff0c;也就是正在执行的程序&#xff0c;然后由操作系统帮助我们将程序转化为进程&#xff0c;完成特定的任务。…

山区特殊场景的倾斜摄影三维模型数据出现几何坐标偏差原因,如何修正这些坐标偏差?

山区特殊场景的倾斜摄影三维模型数据出现几何坐标偏差原因&#xff0c;如何修正这些坐标偏差&#xff1f; 山区倾斜摄影三维模型数据出现几何坐标偏差的原因可能有很多&#xff0c;其中一些常见的原因包括不同地图投影系统之间的转换问题、GPS定位误差、测量设备精度问题、摄影…

AI+边缘,是如何加速制造转型的?

在现代工业中&#xff0c;提起智慧工厂、智能制造有一个经久不衰的话题&#xff0c;那便是IT和OT的融合。 IT&#xff08;Information Technology&#xff09;部门专注于处理数据&#xff0c;整个业务系统需要它来维持运营。而OT&#xff08;Operation Technology&#xff09;…

实战Windows Chrome 0day

遇到挑战跟挫折的时侯&#xff0c;我有一个坚定的信念&#xff0c;我可以断气&#xff0c;但绝不能放弃 漏洞复现 实战Windows Chrome 0day需要满足的条件 第一点是关闭沙箱环境 第一种方式 设置Chrome浏览器的快捷方式 在快捷方式上增加 -no-sandbox 第二种方式 命令行命令…

Studio One6简体中文版全新版本功能详解

Studio One 6是一款强大的音乐编曲软件,可以帮助您使用灵活的和弦轨道功能实现音乐创作。通过新的智能模板、直观的拖放工作流、可定制的用户界面和强大的集成工具&#xff0c;使创建快速而轻松。 无论你选择 Studio One 哪个版本&#xff0c;你都可以得到无限的音轨、通道和插…

微信小程序原生开发功能合集十八:系统主题及自定义主题功能实现

本章实现系统主题监听及相应处理,包括暗黑色、亮色等。并实现自定义主题控制相关功能,可通过菜单进行主题的切换。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: ht…

SpringBoot+Vue 的简历招聘系统

文章目录 1、效果演示2、 前言介绍3、主要技术4 **系统设计**4.1 系统体系结构4.2开发流程设计4.3 数据库设计原则4.4 数据表 5 **系统详细设计**5.1管理员功能模块5.2用户功能模块5.3前台首页功能模块 6、源码获取 1、效果演示 2、 前言介绍 随着科学技术的飞速发展&#xff…