数据在内存中的的存储

1.数据类型介绍

内置类型

char , short , int , long , float , double , long long (C99)

long 类型的大小是 4 / 8 个字节,元素C语言规定 sizeof(long)>= sizeof(int)就行。在32位平台上,long为4个字节,在64位平台上,long位8个字节。

类型的意义

1.使用这个类型开辟内存空间的大小(内存大小决定了适用范围)

2.如何看待内存的视角。(数据存储到内存中和从内存中读取的方式)

类型的分类

整形家族

char : char , unsigned char , signed char。字符的本质是ASCII码值,是整型,所以划分到整型家族。 而char类型又有些特殊,他分成char ,unsigned char , signed char ,当我们用char定义一个字符时,它默认是unsigned char 还是signed char 是标准未定义的,取决于编译器的实现,在vs中默认是signed char。而其他整型家族的类型当没有明确写unsigned和signed时,都默认是signed有符号的整型。

short:unsigned short [ int ] , signed short [ int ]

int  : unsigned int , signed int 

long : unsigned long [ int ] , signed long [ int ]

long long : unsigned long long [ int ] , signed long long [ int ] 

为什么会有 unsigned 和 signed 的区别,生活中有些值是没有负数的,比如人的身高体重年龄,长度宽度等。而我们在之前也知道了有符号数在内存中存的是补码,最高位是符号位,不是有效位,只表示这个数是整数还是负数。当某一种数据只有正数没有负数时,就不需要符号位,这时候每一位都是有效位,都是有数值意义的,这样表示的范围也变大了。

浮点型家族

float         double

表示小数,float 精度低,存储的数据范围较小。double 精度高,存储的数据范围更大。

构造类型(自定义类型)

数组类型,结构体类型( struct ),枚举类型( enum ),联合类型( union )

指针类型

int * ,char * ,void * …………

空类型

void

无类型,通常用于函数返回类型(表示函数不会返回值),函数参数(表示函数不需要传任何参数)和指针类型。

当我们写下一个不需要参数的函数时,我们在调用这个函数的时候如果给他参数,他也会进入函数执行,但是当我们在函数定义的时候用void表示函数不需要参数,这时调用函数传参的话,虽然也会执行函数的内容,但是编译器会报一个警告。

2.整型在内存中的存储

在之前我们讲到了整数的二进制表示有原码、反码和补码三种,而存在内存中的是整数的补码,

我们在内存窗口中看到的是十六进制表示,但是在内存中实际存的还是二进制序列,转换成十六进制更方便我们观察。为什么存在内存中的是补码而不是反码和原码呢?这是因为,使用补码可以将数值域和符号位统一处理,同时,加法和减法也可以统一处理(cpu只有加法器),此外,补码和原码的相互转换,其运算过程是相同的,不需要额外的硬件电路。(由补码得到原码也可以先取反再加一,与原码到补码的过程是一样的)。 

3.大小端字节序介绍和判断

在上面的代码中,我们发现在内存中的数据好像是以字节为单位反着存的。

大小端介绍 ,以十六进制数 0x 11 22 33 44为例

大端字节序存储:把一个数据的高位字节的内容存放在低地址处,把低位字节的内容放在高地址处

小端字节序存储:把一个数据的高位字节的内容放在高地址处,把低位字节的内容放在低地址处。

大端和小端讨论的是字节的顺序,对于一个字节没有顺序可言,只有两个或以上个字节才有顺序的问题。

数据是大端存储还是小端存储不取决于编译器,而是取决于硬件。

我们如何判断我们的机器是大端存储还是小端存储呢?

一个很简单的方法就是存一个整型1,如何查看存进去的第一个字节的内容是什么,如果是1就是小端存储,如果是0就是大端存储。 我们将1的地址强制转换成char*类型就能看他的第一个字节了。

4.浮点型在内存中的存储

根据国际标准IEEE(电气与电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式

(-1)^ S * M * 2^E

这里的 ^ 都是表示次方的意思,不是异或操作符。

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

M表示有效数字。取值为 1<=M<2

2^E表示指数位

举例来说,十进制的5.0,写成二进制的形式为:101.0(小数写成二进制分小数点前和小数点后来写,小数点后的位的权重可以参考整数部分,比如小数点后第一位的权重为2^-1,第二位为2^-2),当我们把101.0的小数点往左移两位,后面就要乘2^2,就可以写成  1.01 * 2 ^ 2  ,按照上面的科学计数法,S为0,M的值为 1.01 ,E的值为 2.

再比如9.5,写成二进制就是1001.1,小数点向左移三位,就可以写成 1.0011 * 2 ^ 3 ,这里的S为0,M为1.0011,E为3.

但是有些值是无法用二进制准确表示出来的,比如9.6,当你把它写成二进制的形式时你会发现不知道要小数点后多少位才能精确表示0.6的大小,而当位数太多时,后面的位可能存不下去,因为float只有四个字节的大小,也就是三十二个比特位,double也只有八个字节的大小,都有可能无法精确保存有些小数。

而知道了浮点数的表示方法后,我们就能大概知道浮点数在内存中只要存储S、M和E就能够表示浮点数。而IEEE754规定:

对于三十二位浮点数(float),最高的一位是符号位S,接着的八位存放指数E,低位的23位用来存放M。

对于六十四位浮点数(double),最高的一位是符号位S,接着的11位用来存放指数E,低位的52位为有效数字M、

IEEE754对有效数字M和指数E还有一些特别规定。

前面说过M是大于等于1,小于二的数,所以M的小数点前的数一定是1,因此这个1可以舍去,只保存后面的小数部分,比如当M为1.01时,只保存01,等到读取的时候再把小数点前的1补上去,这样做能够节省一位有效数字,当我们保存小数点后二十三位时,加上小数点前面的1就相当于能表示24位有效数字。

至于指数E,情况就比较复杂。

首先E是一个无符号整数。如果E为八位,它的取值范围就是0~255,如果E为十一位,他的取值范围就是0~2047,但是我们知道科学计数法中的E是可以出现负数的,比如0.5的E就是-1,所以IEEE754规定,存入内存时E的真实值必须再加上一个中间数,对于八位的E,这个中间数是127,对于十一位的E,这个中间数是1023.就比如 0.5f 的E真实值为-1,要保存成-1+127,也就是126(01111110)。

比如存一个float类型的 5.5f ,写成二进制就是101.1,转换成科学计数法就是1.011*2^2 , S为0,M为1.011,E真实值为2,存入内存时,S为0,E为129(10000001),M存的是011,float存的 M 的位数为23位,位数不够的情况下后面补0,所以M存的是01100000000000000000000.所以5.5f在内存中存的是 0100 0000 1011 0000 0000 0000 0000 0000,转换成16进制就是0x 40 b0 00 00,而小端存储在内存中反着存,存的就是 00 00 b0 40。

这就是浮点数的存储的过程,存储的过程不是很难,难的是读取的过程。

读取时zhishuE从内存中取出还可以再分为三种情况:

1.E不全为0或不全为1

这时候E的计算值减去127(或1023)就得到E的真实值。再把M前面的1还原就能得到真实的浮点数的值(怎么存的就怎么取出来)。

2.E全为0

这时,规定指数E等于1-127(或1023)就是真实值,此时有效数字M不再加上前面的1,而是还原为0.xxxxxx的小数,这样做是为了表示正负0以及无限接近于0的很小的数字。(当E存进去的值为0时,说明真是指数很小,最大都是2^-127,当一个小于2的数乘以这个指数得到的也是一个无限接近0的数)

3.E全为1

在这时,如果有效数字M全为0,表示正负无穷大(正负取决于符号位S)

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

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

相关文章

完整指南:如何使用 Stable Diffusion API

Stable Diffusion 是一个先进的深度学习模型&#xff0c;用于创造和修改图像。这个模型能够基于文本描述来生成图像&#xff0c;让机器理解和实现用户的创意。使用这项技术的关键在于掌握其 API&#xff0c;通过编程来操控图像生成的过程。 在探索 Stable Diffusion API 的世界…

循环链表的用法

7.设 数 组 data[m] 作 为 循 环 队 列 SQ 的 存 储 空 间 &#xff0c;front 为 队 头 指 针 &#xff0c;rear 为 队 尾 指 针 &#xff0c;则 执 行 出 队 操 作 后 其 头 指 针 front 值 为 &#xff08; &#xff09; A&#xff0e;frontfront1 B&#xff0e;front(front1…

上位机图像处理和嵌入式模块部署(qmacvisual自己编写算法插件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;qmacvisual本身支持52个控件&#xff0c;但是指望这52个控件可以cover所有的应用场景&#xff0c;这也不太现实。另外&am…

【DBC专题】-11-使用Cantools将CAN/CANFD DBC自动生成C语言代码

目录 1 安装Python和Cantools 1.1 查看Python已安装的Package包 1.2 在Python中安装Cantools插件包 1.3 获取更多Cantools工具的更新动态 2 经典CAN/CANFD DBC自动生成C语言代码 2.1 批处理文件CAN_DBC_To_C.bat内容说明 2.2 经典CAN/CANFD DBC文件要求 2.3 如何使用生…

腾讯云k8s容器服务

1、新建一个集群 这个网址&#xff1a; 登录登录 - 腾讯云 2、选择第一个 3、名字随便起一个&#xff0c;然后基本默认就行 4、 组件配置直接跳过&#xff0c;信息确认&#xff0c;等待集群初始化&#xff0c;等10分钟左右&#xff08;容器服务需要充点钱才行&#xff09; 5…

瑞_JVM虚拟机_类的生命周期_初始化阶段 <clinit>

文章目录 1 JVM虚拟机概述2 类的生命周期2.1 加载阶段2.2 连接阶段2.3 初始化阶段\<client> ★★★★★2.3.1 案例一2.3.1.1 案例描述2.3.1.2 解析字节码指令 2.3.2 案例二2.3.3 小结2.3.4 代码中触发类的初始化的方式2.3.4.0 设置打印出加载并初始化的类2.3.4.1 方式一2…

three.js 鼠标左右拖动改变玩家视角

这里主要用到了 一个方法 obj.getWorldDirection(); obj.getWorldDirection()表示的获取obj对象自身z轴正方向在世界坐标空间中的方向。 按下 W键前进运动&#xff1b; <template><div><el-container><el-main><div class"box-card-left…

redis学习-List类型相关命令以及特殊情况分析

目录 1. lpush key value1 value2 ... 2. lrange key start end 3. lpop key num 4. rpush key value1 value2 ... 5. rpop key num 6. lindex key index 7. llen key 8. lrem key num value 9. rpoplpush key1 key2 10. lset key index value 11. linsert key before/after…

【STL】List容器介绍+相关练习题详细版本

List 1.List介绍2.使用注意3.list与vector的对比4.练习题 1.List介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;…

索引常见面试题

面试中&#xff0c;MySQL 索引相关的问题基本都是一系列问题&#xff0c;都是先从索引的基本原理&#xff0c;再到索引的使用场景&#xff0c;比如&#xff1a; 索引底层使用了什么数据结构和算法&#xff1f;为什么 MySQL InnoDB 选择 Btree 作为索引的数据结构&#xff1f;什…

5_springboot_shiro_jwt_多端认证鉴权_禁用Cookie

1. Cookie是什么 ​ Cookie是一种在客户端&#xff08;通常是用户的Web浏览器&#xff09;和服务器之间进行状态管理的技术。当用户访问Web服务器时&#xff0c;服务器可以向用户的浏览器发送一个名为Cookie的小数据块。浏览器会将这个Cookie存储在客户端&#xff0c;为这个Co…

30.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据搜索功能

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;29.数据推测功能…

从爬楼梯到斐波那契数列:解密数学之美

题目描述 我们来看看力扣的一道经典问题70. 爬楼梯 递归 假设n级台阶有climbStairs(n)种方法爬到楼梯顶。如果有n级台阶&#xff0c;如果第一次往上爬1级台阶&#xff0c;就会剩下n-1级台阶&#xff0c;这n-1级台阶就有climbStairs(n-1)种方法爬到楼梯顶&#xff1b;如果第一…

【Week Y2】使用自己的数据集训练YOLO-v5s

Y2-使用自己的数据集训练YOLO-v5s 零、遇到的问题汇总&#xff08;1&#xff09;遇到git的import error&#xff08;2&#xff09;Error&#xff1a;Dataset not found&#xff08;3&#xff09;Error&#xff1a;删除中文后&#xff0c;训练图片路径不存在 一、.xml文件里保存…

【MySQL】MySQL视图

文章目录 一、视图的基本使用1.创建视图2.修改了视图&#xff0c;对基表数据有影响3.修改了基表&#xff0c;对视图有影响4.删除视图 二、视图规则和限制 一、视图的基本使用 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称…

Vulnhub - Jarbas

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Jarbas 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/jarbas-1,232/ 0x01 信息收集 Nmap…

机器学习/深度学习绘图模板(PPT)

机器学习/深度学习绘图模板(PPT) 34页PPT&#xff0c;包含40图片模板 部分标注了论文出处 点击&#xff1a;我的B站工房 购买&#xff0c;粉丝专享价4.9元&#xff0c;线上交付&#xff0c;支付后自动发货。

Android Studio实现内容丰富的安卓民宿酒店预订平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看民宿 3.民宿预订 4.民宿预订支付&#xff0c; 5.支付订单 6.评论管…

MySQL的基本概念

一.MySQL概念&#xff1a; 你可以把MySQL想象成一个大杂货店&#xff0c;里面有很多货架&#xff0c;每个货架上摆放着不同种类的商品&#xff0c;MySQLMySQ就像是这个杂货店的后台库存管理系统。 1.表格&#xff08;货架&#xff09;&#xff1a;每个货架上摆放商品&#xff0…

Linux入门级别命令(下载远程连接工具)

$pwd&#xff08;当前所在位置&#xff0c;显示打印当前工作目录&#xff09;$mkdir 创建目录$cd dir 换个位置&#xff08;进入某一个目录&#xff09;$cd 什么都不加回到最开始的目录$ls当前目录位置下的文件信息&#xff08;列出当前所在位置下有哪些东西&#xff09;$mv移动…
最新文章