目录
浮点型在内存中的存储
一、浮点型数字的二进制
二、浮点型在内存中的存储形式
1、浮点型的二进制规范写法:
1.1、普通写法:
1.2、科学计数法:
1.3、根据国际标准IEEE(电气和电子工程协会) 754的写法:
2、浮点型在内存中的存储方式:
关于S:
关于M:
关于E:
转化案例:
3、关于取出浮点数再内存中的数据
3.1、E不全为0或不全为1
3.2、E全为0
3.3、E全为1
浮点型数字的二进制形式转化为十进制其实也是和整数型数字转化为二进制一样,通过权重进行运算。
权重详情:http://t.csdn.cn/dw8tX
例如,数字5.5
它的整数部分是5,转化为二进制是101,而小数部分是0.5,拿0.5这么转化为二进制呢?
其实,小数部分也和权重有关,如下图所示:
小数点的右边一位的权是2的-1次方,所以权重是2的-1次方乘1,也就是得到数字0.5
而小数点的右边的第二位的权是2的-2次方,所以权重是2的-2次方乘1,得到数字0.25
所以进制的小数部分是0.5+0.25=0.75
如上文所诉,我们可以得知了5.5的二进制运算法则,那么5.5这个浮点型数字的二进制这么表达呢?
其实上文也有展示,这其实就和普通浮点型的表达形式一样,用小数点将整数部分的二进制和小数部分的二进制分开。
例如:V = 5.5 它的二进制表达数为,101.1 其中小数点将整数和小数部分隔开,也因此,我们也可以直到那个是小数部分的权,那个是整数部分的权。
对于浮点数而言,科学计数法是一个十分方便的写法。
例如:123.45可以写为1.2345*10^2 将小数点朝前移动两位,并乘上10的2次方,使得整数只剩下一位。
- 而在浮点数的二进制形式中也可以这样写。
- 例如:V = 5.5 它的二进制写法是101.1 那么使用科学计数法则是 1.011*2^2 和十进制一样,将小数点往前移动两位,但因为是二进制,由于满二进1的原则,所以这里乘的是2的二次方,这和10的2次方是一个道理。
其实,这就是科学计数法的一种升级版。
在科学计数法的基础上增加了一个符号位,也就是(-1)^ s
(-1)^ s 表示的是一个正负号,当s为0时表达是正数,当s为1时表达的是负数。
例如:
又例如:
在IEEE754的规范标准下,浮点型在内存中其实只要存储,S、E、M等即可。
因为S只是表达正负,所以S存储的是0或1,0表达正数,1表达负数
为了将M的存储更为简便,或者说提高精度,我们在存储时只存储小数部分。
例如:
E的情况较为复杂,因为E必须是一个无符号的整型数值,但是作为科学计数法的E是会出现负数的。
例如:
所以,这时候我们就出现了一个中间值!
V = 5.5 ——十进制
V = 101.1 —— 二进制
V = 1.011*2^2 ——科学计数法
V = (-1)^ 0 * 1.011 * 2 ^ 2 —— IEEE754
V = 0 10000001 011 00000000000000000000
V = 4 0 b0 00 00 ——数据存储再内存后,使用16进制再内存块中的展示
————以小端字节进行展示!
关于取出数据,只需要观察E的情况。
这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1
比如:
0.5 的二进制形式为0.1
所以其最后二进制表示形式为:
全0情况,存储在内存中是加了127或者1023的,而这种加了后还全0的情况那么E就是-127或者-1023,所以这种数字(整个浮点数)表示的就是无限接近与0的数。
那么这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示+0,以及接近于0的很小的数字。
这时,如果有效数字M全为0,表示无穷大(正负取决于符号位s)。