飞道的博客

C语言-数据的存储-浮点数的存储(8.2)

370人阅读  评论(0)

目录​​​​​​​

思维导图:

浮点型在内存中的存储

1.1一个经典的例子

1.2 浮点数存储规则

1.3实践举例

写在最后:


思维导图:

浮点型在内存中的存储

1.1一个经典的例子


  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 9; //以整形的形式存储
  5. float* pFloat = ( float*)&n; //强制类型转换成浮点型的指针
  6. printf( "n的值为:%d\n", n); //以整形的形式取出
  7. printf( "*pFloat的值为:%f\n", *pFloat); //以浮点型的形式取出
  8. *pFloat = 9.0; //以浮点型的形式存储
  9. printf( "num的值为:%d\n", n); //以整形的形式取出
  10. printf( "*pFloat的值为:%f\n", *pFloat); //以浮点型的形式取出
  11. return 0;
  12. }

通过观察我们可以发现,用整形的方式存储和用浮点型的形式存储,拿出来的结果不同。

由此,我们可以大胆推测,整形和浮点型在内存中的存储方式不同。

那浮点型在内存中究竟是怎么存储的呢?

1.2 浮点数存储规则

根据国际标准IEEE(电气和电子工程协会) 754,

任意一个二进制浮点数V可以表示成下面的形式:

(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位

举一个简单的例子:

十进制的 5.0

先转换成二进制:101.0

写成浮点数的形式:(-1)^0 * 1.01 * 2^2

相当于:S=0 , M=1.01 , E=2

那浮点数又是怎么存到内存里面的呢?

IEEE 754规定:

对于32位的浮点数,最高的1位是符号位s,

接着的8位是指数E,剩下的23位为有效数字M。

对于64位的浮点数,最高的1位是符号位S,

接着的11位是指数E,剩下的52位为有效数字M。

并且,规定中还有一些特殊的规则:

E是一个无符号整数,

这意味着当E为8位时,取值在1~255,

当E为11位时,取值在0~2047,

但是在实例中,E有可能为负数,所以,

IEEE 754规定,存入内存时E的真实值必须再加上一个中间数

单精度时加127,双精度时加1023

当然,规则总是说不完的,我们直接上实例:

1.3实践举例

我们通过刚刚学的存储方式,直接对一开始的那段代码进行分析:


  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 9; //以整形的形式存储
  5. //补码 - 00000000000000000000000000001001
  6. //转换形式
  7. //用浮点型的形式取出
  8. //0 00000000 00000000000000000001001
  9. //(-1)^0 * 0.00000000000000000001001 * 2^-126
  10. //0.000000
  11. float* pFloat = ( float*)&n; //强制类型转换成浮点数的指针
  12. printf( "n的值为:%d\n", n); //以整形的形式取出//没有变化,打印 9
  13. printf( "*pFloat的值为:%f\n", *pFloat); //以浮点数的形式取出//打印 0.000000
  14. *pFloat = 9.0; //以浮点数的形式存储
  15. //9.0
  16. //二进制 - 1001.0
  17. //(-1)^0 * 1.001 * 2^3
  18. //s=0, e=3, m=1.001
  19. //补码 - 01000001000100000000000000000000
  20. printf( "num的值为:%d\n", n); //以整形的形式取出//打印 1091567616
  21. printf( "*pFloat的值为:%f\n", *pFloat); //以浮点数的形式取出//打印 9.000000
  22. return 0;
  23. }

这就是浮点型在内存中的存储。

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。


转载:https://blog.csdn.net/Locky136/article/details/128576744
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场