其中,5=E-常数=e,M=0.11010101,S=0。
我们知道浮点数分为单精度和双精度。
若是单精度,则占4个字节,E占8位,M占23位,再加上S段,总共就是32位,刚好也是4个字节,两者是一致的。
若是双精度,则占8个字节,E占11位,M占52位,再加上S段,总共就是64位,刚好也是8个字节,这两者也是一致的。
1、那么,如果58.625是单精度浮点数,那它在内存中的二进制存储是怎么样的呢?
首先,我们先要明确一个前提:
若是单精度,那么E就占8位,取值范围就是0~255,且e=E-127,所以e的取值范围就是-127~128。
那么,接下来,我们就可以开始计算了:
显然,S=0,因为58.625是正数。
而E=e 127=5 127=132,转换成二进制就是1000 0100。
M则取小数部分,所以M=1101 0101。
所以,最终58.625在内存存储的二进制就是:
由于单精度占4个字节,所以要在不改变数值的大小的前提下将位数补齐,所以才在小数后面补0。
若是-58.625,那就只需把S改成1即可,其他位不变。
2、如果58.625是双精度浮点数,那它在内存中的二进制存储是怎么样的呢?
同样,首先,我们需要明确一个前提:
若是双精度,那么E就占11位,取值范围就是0~2047(即2048-1=2^11-1),且e=E-1023,所以e的取值范围就是-1023~1024。
接下来,我们再开始计算双精度的二进制:
显然,S=0,因为58.625是正数。
而E=e 1023=5 1023=1028=1028的二进制。
M则同样取小数部分,所以M=1101 0101。
所以,双精度的58.625在内存中的二进制存储就是:
同样,若是-58.625,则只需把S改成1即可,其他位不变。
补充:二进制浮点数如何转换成十进制浮点数?
依旧以单精度的58.625为例。
由前面可知,单精度的58.625的二进制为:
0 1000 0100 110 1010 1000 0000 0000 0000
首先,计算出指数的幂次:
明确一个前提:E=e 127
所以,E=1000 0100=132
所以,e=E-127=132-127=5
又由于S=0,所以该数值为正数。
所以,
好了,我们已经把“在内存中存储的浮点数的二进制”转换成了“我们比较好识别的浮点数的二进制”,即“能够区分出整数部分和小数部分”的浮点数的二进制。
整数部分的二进制转换成十进制,这里我们就不再赘述了。方法和普通的“十进制整数与二进制之间的转换”一样。重点和难点在于,如何将小数部分的二进制转换成十进制。那么,怎么转换呢?
首先要明确一点:小数部分是0.101
其次,将小数部分的二进制转换成十进制,其方法其实和“二进制整数转换成十进制整数”的方法是类似的,只不过,指数的幂次是负数。具体过程如下: