Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。
🌈个人主页:主页链接
🌈算法专栏:专栏链接
我会一直往里填充内容哒!
🌈LeetCode专栏:专栏链接
目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出
🌈代码仓库:Gitee链接
🌈点击关注=收获更多优质内容🌈
近期在复习计算机组成原理,刚好看到了浮点数存储,想起许久之前,就学过了,于是乎记录一下
浮点数存储例子:
int main() { int n = 9; float *pFloat = (float *)&n; printf("n的值为:%d\n",n); printf("*pFloat的值为:%f\n",*pFloat); *pFloat = 9.0; printf("num的值为:%d\n",n); printf("*pFloat的值为:%f\n",*pFloat); return 0; }
这里执行完的结果是啥呢?相信没看过相关内容前都各有各的答案,咱暂且按下不表. 接下来看看浮点数在内存中如何存储的
内存中的存储:
由于所有数在机器中都是以二进制的方式进行存储.如果是整形就很简单了,是多少就存多少.
这里以5举例,在二进制中为 101
那浮点数如何存储呢?
这里以5.5举例,他的二进制码为 101.1,前面很好理解,就是照搬5的存储方式
那后面呢?我们知道在整形里最低位为2^0,那么在浮点数中下一位自然是2^(-1),2^(-2)...依此类推
好的 我们知道了5.5的二进制码为101.1,这里将101.1转换为科学计数法就是1.011*2^(-2)
那么符号是啥呢,正号!那么就这样存储 (-1)^0*1.011*2^(-2)
让我们来观察下这组数据的存储格式,发现
有表式符号的 0(负数)或1(正数) 有表式有效数字的1.011 有表示数位的 -2
在浮点数中:称符号位为S,数位为E,有效数字为M
注:绿色为64位(double精度 以下为float类型举例
符号位存储使用1个bit大小 这很好理解,0为正数1为负数
有效数字使用23个bit大小 因为有效数字为1.xxxxx所以我们舍去1的存储,仅在内存中存入xxxx在取出的时候再加入1即可
数位使用8bit大小,因为E中存在有符号情况,而为了表示的数字更多,我们不使用第一位作为符号位的情况,将数据+127后进行存储(如上面的-2 我们存入内存中为125)
数据取出:
了解完了如何存储,那如何取出呢
如上方5.5的例子:
在内存中存储为 0 10000001 01100000000000000000000000000000
在16进制中表示为 40 B0 00 00
将这个数据取出,
符号位S直接取出,为0
M也直接取出后在前面直接写上1.即可
E就有点麻烦了:
分为三种情况 第一种情况不为全一或者全零则讲该数据直接-127取出即可
第二种情况为全一,此时为2^8=256-1=255 哪怕减去127也为2^128 有点太大了,所以我们直接将这种情况写为无穷(正负仍看符号位)
第三种情况为全0,此时1-127=-128 ,2^-128太小了,无穷小,所以我们直接补上符号位,也不再写1.x而是直接写上0.x
例子:
所以开头的例子输出应该为:
9
第二个变为浮点数存储
000000000000000000001001 此时E为0 变为无穷小 所以输出为0.00000
第三个结果在内存中以浮点数存储 输出9.0
但第四以整数的形式去读取浮点数存储
所以 9.0=1001=(-1)^0*1.001*2^(3)
0 10000010 00100000000000000000000000000000
所以输出的结果为10104000000000
完结撒花:
🌈本篇博客的内容【浮点数在内存中的存储】已经结束。
🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。
🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。
🌈诸君,山顶见!