【C语言】浮点型在内存当中的存储

时间:2022-10-19 11:17:27

????write in front????   

????大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流????

????2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 阿里云星级博主~掘金⇿InfoQ~51CTOP创作者(创作新人榜No.38)~[CSDN]周榜102﹣总榜826 ⇿ 全网访问量35w+????

????本文由 謓泽 原创 发布在51CTOP 如需转载还请通知⚠

????个人主页-​謓泽51Ctop的博客​????

????欢迎各位→点赞???? + 收藏⭐️ + 留言????

????系列专栏-​謓泽51Ctop的分类_51CTO博客​????

✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本????

【C语言】浮点型在内存当中的存储

大端小端介绍:

浮点型在内存当中的存储

常见的浮点数:

  • 3.14 、1E10(这个其实就是1.0✖10的10次方—E)

浮点数包括:

  • C语言中的浮点类型有float、double 和 long double 类型。

记数法实例:

【C语言】浮点型在内存当中的存储

【C语言】浮点型在内存当中的存储

  1. 第1列是一般记数法
  2. 第2列是科学记数法
  3. 第3列是指数记数法(或称为e记数法);
  • 这是科学记数法在计算机中的写法,e后面的数字代表10的指数;

接下来给大家看一个代码:

#include <stdio.h>
int main(void){
int n = 9;
float *pFloat = (float *)&n;
printf("*pFloat的值为:%d\n",n);
printf("*pFloat的值为:%lf\n", *pFloat);

*pFloat = 9.0;
printf("num的值:%d\n", n);
printf("*pFloat的值为:%lf\n",*pFloat);

return 0;
}

【C语言】浮点型在内存当中的存储

  • 运行结果:
  • 【C语言】浮点型在内存当中的存储

    【C语言】浮点型在内存当中的存储

  • ​编辑
  • 从上述代码可以看出:浮点型和整形的内存的存储的形式不一样!
  • 可能会有些小伙伴有些疑问,为什么第二行运行结果的*pFloat的答案是:0.000000,还有第三行的num的运行结果是:1091567616,我觉得因该是 9.000000 和 9啊。好,别着急现在就来说说为什么!
  • 打印:0.000000是因为:整形的形式放进去的时候在以浮点数的形式往后拿的话,拿不到我们期望的一个结果,那是不是可以说明整形的存储结果和浮点型的存储的方式是不一样的,如果一样那就是一样的结果了
  • 打印:1091567616是因为:*pFloat我们是用浮点数的形式存放进去的,然后以n的正数形式在拿的时候是整数的形式拿出来的,拿出来了一个错误的值
  • 从这里就说明了整形的存储方式和浮点型的存储方它们是由区别的????

浮点数二进制补码

  • 例如:7.0 — 0111 — 0111.0(小数点后面给个0就可以了) 这就是7.0的二进制的表现形式????
  • 任何一个二进制的浮点数V可以表示成下面的形式:
  • (-1)^ M * 2 ^ E
  • (-1)^ s表示符号位,当s = 0的时候,V = 正数除了0以外,任何数的0次方等于1)当s=1的时候,V = 负数
  • M表示的是有效数字,大于等于1,小于2
  • 2 ^ E表示指数位

存储模式图: 

【C语言】浮点型在内存当中的存储

【C语言】浮点型在内存当中的存储

【C语言】浮点型在内存当中的存储

【C语言】浮点型在内存当中的存储

  • 如下实例:浮点数9.0
  • 1001
  • 1001.0
  • 1.001 * 2 ^ 3  —— 注意:这个是二进制
  • (-1) ^ 0*1.001 * 2 ^3= (-1)^ M * 2 ^ E
  • 0 10000010 00100000000000000000000  —— E = 3 + 127 = 130
  • 当成原码直接打印的就是我们上面说的数字 1091567616
  •     这样就可以确定的是 — s = 0 ,M = 1.001 ,E = 3 ,注意M = 1.001 实际上是:0001
  • 如下实例:浮点数0.5
  • 0.5
  • 0.1 — 注意:这个是二进制当中的 -1 对于小数点来说后面的第一位数,是2的负一次方就是0.5
  • 1.0 *  2 ^ -1 —— 转换成科学计数法
  • (-1 ^ 0) *1.0 * 2 ^-1 —— 注意:指数E为一个无符号数字来看待的
  • s = 0,M = 1.0,E = -1
  • 对于八位的E来说是,这个中间的数是:127,对于十一位的E来说是,这个中间数是1023,其实就是如果你的E是负数的话,就拿-1来举个例子 八位的就是:-1+127 = 126,11位的就是:-1+1023 = 1022

 E不为全0也不为全1

  • 浮点数 5.5
  • 101.1   // 前面是101按照8421码来,后面的就是2的负一次方 等于 0.5
  • (-1) ^ 0 * 1.001 * 2 ^ 2
  • s = 0 ,M = 1.011 ,E = 2 (E+127=129)
  • 0100 0000 1011 0000 0000 0000 0000 0000 ——这里E的存储是129,E的值还是129-127=2,如果你是double的数字那么这里要减去1023才能的到真实的E的值
  • 0x40B00000 —— 转换出来的二进制转换十六进制数字
  • 调试当中内存的结果:
  • 【C语言】浮点型在内存当中的存储

 E全为0 (了解即可)

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是为了还原位0.xxxxxx的小数,这样做是为了表示±0,以及接近于0的很小数字。

 E全为1 (了解即可)

这时,如果有效数字M全为0,表示±无穷打(正负取决于符号位s)

【C语言】浮点型在内存当中的存储

【C语言】浮点型在内存当中的存储