重生之我在异天放学编程之C语言:数据在内存中的存储篇(下) ...

打印 上一主题 下一主题

主题 866|帖子 866|积分 2598

各人好,这里是小编的博客频道
小编的博客:就爱学编程
    很高兴在CSDN这个各人庭与各人相识,希望能在这里与各人共同进步,共同收获更好的自己!!!
  
  


   那接下来就让我们开始遨游在知识的海洋!
  浮点型数据在内存中的存储


引导

我们先来一个标题激一激,标题——读出下列代码运行的结果
代码:
  1. #include<stdio.h>
  2. int main() {
  3.         int n = 9;
  4.         float* p = (float*) &n;
  5.         printf("%d\n", n);
  6.         printf("%f\n", *p);
  7.         *p = 9.0;
  8.         printf("%f\n", *p);
  9.         printf("%d\n", n);
  10.         return 0;
  11. }
复制代码
宝子们快用你们的小脑袋想一想吧!!!


















运行结果:



  • 在学习浮点型在内存中的存储之前,你是否只能准确预见第一行和第三行的输出情况?别担心,跟紧小编的步伐,来看看浮点型在内存中的存储。

正文

1.十进制浮点数转换为尺度存储的二进制浮点数


(1)第一步:十进制浮点数转换为二进制浮点数

部门转换方法整数部门同十进制整数转换为二进制整数一样小数部门根据权重举行配凑,从小数点后第一位2^-1开始本质都是根据权重的巨细不同举行配凑
(2)第二步:二进制浮点数转换为尺度储存的二进制浮点数

根据国际尺度IEE(电气与电子工程协会)754,任意一个二进制浮点数可以表示成这样的情势:(-1)^S * M * (2)^E
元素寄义S表示符号位,为0则为正数,为1则为负数M表示有用数字,大于即是1,小于2E表示二进制下的指数位 例:
     
2.尺度存储的二进制浮点数的存储规则

(1)第一部门:存储位置

元素存储位置float32bit位S存放于第1个bit位M存放于第2个bit位~第9个bit位,8个bit位E存放于第10个bit位~第32个bit位,23个bit位double64bit位S存放于第1个bit位M存放于第2个bit位~第12个bit位,11个bit位E存放于第个13bit位~第64个bit位,52个bit位 现实效果:


(2)第二部门:存储的方式

元素存储方式S无特殊,正常存M由于总是满足1<=M<2,以是我们举行存储的时间,就不消把1存入,这样就节省了一位bit位,可存的M的范围就更大了E较复杂,分标题和解决方案两个模块举行解说 名称内容标题首先,E在内存中存储时是一个无符号整数,只有浮点数整体才是有符号的,但是我们知道在科学记数法中,E存在有负数的可能解决方案以是我们规定:给每个现实的E值加127(对于double是1023)再存入bit位中 以float为例:
     
   通过以上的两个知识点,我们就能了解够浮点型在内存中是如何存储的,但存进去了,又该怎么读取呢?接下来就来介绍读取的方法
  3.浮点数的读取规则

(1)第一部门:占位符

占位符作用%f把一个数据的二进制位以单精度浮点数(float)的读取规则举行读取%1f把一个数据的二进制位以双精度浮点数(double)的读取规则举行读取
(2)第二部门:读取规则

以E的值分别为三种情况读取规则E不为全0或不为全1(1)先把尺度存储的二进制浮点数的情势读出来:S:是0真实值符号位就为1(正数),是1真实值符号位就为-1(负数);E:先把对应区域的二进制转换成十进制数,再-127(double类型则-1023)。M:直接把对应区域的二进制转换成十进制数,再在前面加上1和小数点;(2)最后:根据十进制浮点数转换为尺度存储的二进制浮点数逆推归去得到真实值(十进制浮点数)E全为1无穷E全为0无穷趋近于0
   学完了这些,我们再转头看看引导的那道题
  代码:
  1. #include<stdio.h>
  2. int main() {
  3.         int n = 9;
  4.         float* p = (float*) &n;
  5.         printf("%d\n", n);
  6.         printf("%f\n", *p);
  7.         *p = 9.0;
  8.         printf("%f\n", *p);
  9.         printf("%d\n", n);
  10.         return 0;
  11. }
复制代码
序号分析1 int n = 9;首先我们创建了一个整型变量n,并为它分配了4个字节的内存空间2这4个字节,也就是32个bit位存放的二进制序列为:000000000000000000000000000001001(原码)000000000000000000000000000001001(补码)3 float* p = (float*) &n然后我们创建了一个浮点型指针变量float* p4 printf(“%d\n”, n);接着用了%d的占位符对整型变量n的二进制序列(补码)举行访问和打印:%d是将一个二进制数列(补码)当成有符号的整型变量,并转换为原码的十进制打印。类比到这里,就是把00000000000000000000000000001001(补码)按照有符号整型的变更规则酿成00000000000000000000000000001001(原码),再转换(十进制)9举行打印5 printf(“%f\n”, *p);再接着用了%f的占位符对整型变量n的二进制序列(补码)举行访问和打印:%f是将一个二进制数列(补码)当成单精度浮点数,并转换为原码的十进制打印。类比到这里,就是把00000000000000000000000000001001(补码)按照单精度浮点数的读取规则酿成(-1)^0 * 1.00000000 * 2^(-118)(二进制浮点数的尺度存储情势),再转换(十进制)0.0000000……举行打印6 *p = 9.0;再然后使用了解引用操作符*,对n的地址中原存的二进制序列00000000000000000000000000001001(补码)以单精度存储规则举行了重新存储:先把我们要存的9.0(十进制浮点数)酿成(-1)^0 * 1.001 * 2 ^ 2 (二进制浮点数的尺度存储情势),然后再转换为00010000000000000000000000000010(补码)7 printf(“%f\n”, *p);再接着用了%f的占位符对现在的n中存储的二进制(上述补码)举行访问和打印:%f是将一个二进制数列(补码)当成单精度浮点数,并转换为原码的十进制打印。类比到这里,就是把00010000000000000000000000000010(补码)按照单精度浮点数的读取规则酿成(-1)^0 * 1.001 * 2 ^ 2 (二进制浮点数的尺度存储情势),,再转换(十进制)9.00000000……举行打印8 printf(“%d\n”, n);最后用了%d的占位符对现在的n中存储的二进制(上述补码)举行访问和打印:%d是将一个二进制数列(补码)当成有符号的整型变量,并转换为原码的十进制打印。类比到这里,就是把00010000000000000000000000000010(补码)按照有符号整型的变更规则酿成00010000000000000000000000000010(原码),再转换(十进制)1096517616举行打印 这样我们就得到了


快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表