整型、浮点型在内存中的存储和大小端存储模式

本篇将讲解整型数据和浮点型数据在内存中的存储方式,要注意内存存储都是以二进制的形式存储的


目录

大小端存储模式:

大端模式: 

 小端模式:

整数在内存中的存储:

浮点数在内存中的存储:

浮点数存储方式:

浮点数存储过程:

浮点数取出过程(三种情况):


 

大小端存储模式:

 因为系统储存都是以一个字节为单位,而像 short、int 等类型都是大于 8 bit 的,而对于位数大于 8 位的处理器,由于寄存器宽度大于一个字节,所以存在存放一个大于一个字节的数据时,如何将它的多个字节安排的问题,所以有了大端存储模式和小端存储模式

大端模式: 

数据低位字节内容存在高地址处,高位字节内容存在低地址处 

 小端模式:

数据低位字节内容存在低地址处,高位字节内容存在高地址处

 例:


整数在内存中的存储:

对整形来说:数据存放时存放的是补码

注:正整数的原、反、补码都相同,而负整数的原、反、补码如下:

原码:将数值按照正负数的形式转换为二进制

反码:原码符号位不变,其他位按位取反

补码:反码 +1

注:补码取反 +1 也可以直接得到原码

                                            像上面大小端的例子也可以写成这样:

 

注意:内存本质上存的是二进制数,这里因为 a 的补码就等于它的原码(也就是它所转换的二进制形式),所以存的就真实储存情况就如图中所示;而前面大小端中举的的例子,里面写的是十六进制的数,这只是把真实储存的二进制数转换为十六进制方便我们观察,真实存的还是二进制而非十六进制

                                                        再举一个负整数的例子:


浮点数在内存中的存储:

 根据国家标准 IEEE 754,任意一个二进制浮点数 V 可以表示为:

例:十进制的 5.5,写成二进制是 101.1,相当于1.011 * 2^2,其中:S = 0,M = 1.011,E = 2

这里再讲解一下为什么十进制 5.5 写成二进制是 101.1:


浮点数存储方式:

对于 32 位的浮点数,最高的 1 位存储符号位 S,接着的 8 位存储指数 E,剩下的 23 位存储有效数字 M

对于 64 位的浮点数,最高的 1 位存储符号位 S,接着的 11 位存储指数 E,剩下的 52 位存储有效数字 M

因为 64 位浮点数可以存储的有效数字位数比 32 位浮点数更多 ,像上面当配凑二进制时可以配凑更多的位数,所以 64 位浮点数的精度更高,被称为双精度浮点数,而 32 位浮点数被称为单精度浮点数


注意:浮点数存储和取出过程对 M 和 E 会有一些特别规定

浮点数存储过程:

因为存储 M 时,默认这个数第一位总是 1,所以存储时会被被舍去,以节省一个位,例:保存 1.011 时,只保存 011

因为 E 真实情况可能为负数,而储存空间中的数都是当作正数处理的,所以规定存储 E 时要加上一个中间数,以让一些负数情况得以以正数的情况保存,对于 8 位的 E 是 127,对于 11 位的 E 是 1023,例 2^2 的 E 是 2,保存为 32 位浮点数时将会保存为 2 + 127 = 129,即 10000001

浮点数取出过程(三种情况):

E 不全为 0 或不全为 1:M 真实值为存储的 M 加上第一位的 1,E 的真实值为存储的 E 减去127/1023,再通过上面 V 的表示方法计算而出

E 全为 0,因为存储的 E 加上 127/1023 都还为 0,所以认定这个浮点数是一个无穷小接近 0 的数字(或者就是 0 ),规定这时真实 E 等于 1 - 127/1023,并且真实 M 不再加上第一位的 1

E 全为 1,这时表示这个浮点数为 +- 无穷大(正负取决于符号位 s)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值