本篇将讲解整型数据和浮点型数据在内存中的存储方式,要注意内存存储都是以二进制的形式存储的
目录
大小端存储模式:
因为系统储存都是以一个字节为单位,而像 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)