当前位置: 首页 > article >正文

整形数据和浮点型数据在内存中的存储差别

愿所有美好如期而遇



我们先来看代码,猜猜结果是什么呢?

int main()
{
    
    //以整型数据的方式存储
   	int n = 10;
	float* m = (float*)&n;
    
    //以整型数据的方式读取
	printf("%d\n", n);
    //以浮点型数据的方式2读取
	printf("%f\n", *m);

	printf("----------------------------\n");

    //以浮点型数据的方式存储
   	*m = 10.0;
    //以整型数据的方式读取
	printf("%d\n", n);
    //以浮点型数据的方式读取
	printf("%f\n", *m);

	return 0;
}

你是不是觉得答案是10   10.0   10   10.0 呢?

那么我们接下来解释一下为什么是上面那个结果

首先,整型数据和浮点型数据在内存中的存储方式是不同的

(1)整型数据的存储方式是怎样的呢?

在看下面的解释前,如果看不懂请参考:原码,反码,补码,char大小范围的解释

整型数据在内存中直接转换为二进制后以补码形式存储。

(2)浮点型数据的存储方式是怎样的呢?

我们要对他的二进制分三部分去看,符号位,指数位,有效数字位(已经用空格分开)

10.0我们可以写成(-1)^0 *1.010* 2^3,(-1)^0,0就是符号位,正数为0,负数为1,1.010就是我们的有效数字,2^3,3就是我们的指数,但是float类型的数据指数在存储时需要加上127,double类型的数据指数在存储时要加上1023,这是IEE754的规定。

而且他还规定了float的指数位有8位,有效数字位23,double指数位有11位,有效数字位52位。数位为unsigned int类型,恒为正数。

指数为3 + 127 ,也就是130,转换为二进制也就是10000010,而有效数字位不存储1,在读取数据时自动前面补1,这样就节省了一位去存储有效数字,也就提高了精度。

读取数据时如何读取?分三种情况:

一:指数位不是全0也不是全1

好比我们上面的10的二进制,我们读取时如何读取?

先看符号位,是正数,然后看指数位,指数位减去127,也就剩下3,也就是2^3,再看有效数字位,0100...,也就是1.0100......,最后我们乘起来:(-1)^0   *   2^3    *    1.010...

二:指数位全是0

那也就相当于我们原来的指数是-127,加上127后为0,那么指数位就是2^-127,这时,我们在读取时就丢掉有效数字位本来会加的那个1,直接用符号位乘指数以及后面的有效数字位。

三:指数位全是1

也就相当于是128+127,我们原本的指数位就是128,也就是2^128,表示一个非常大的数据。


http://www.kler.cn/a/134986.html

相关文章:

  • 比ChatGPT更酷的AI工具
  • UniApp 应用、页面与组件的生命周期详解
  • qt QKeySequence详解
  • golang如何实现sse
  • 每日一练:二分查找-搜索插入位置
  • FatLab:我的编程课程系列
  • 微服务调用链路追踪
  • 使用Python实现3D曲线拟合
  • Java爬虫的使用案例及简单总结
  • 场景交互与场景漫游-路径漫游(7)
  • 腾讯云轻量数据库性能如何?轻量数据库租用配置价格表
  • JavaScript实现飞机发射子弹详解(内含源码)
  • 超聚变服务器关闭超线程CPU的步骤(完整版)
  • 【开源】基于Vue.js的在线课程教学系统的设计和实现
  • 右键菜单和弹出菜单的区别
  • 基于springboot实现校园在线拍卖系统项目【项目源码】计算机毕业设计
  • 如何在Linux上搭建本地Docker Registry并实现远程连接
  • vscode 推送本地新项目到gitee
  • Linux入门(三)
  • 22. 深度学习 - 自动求导
  • 反射和序列化操作会破坏单例模式
  • redis 介绍1
  • three.js相机调用reset方法复原但无法完全复原
  • docker 部署Redis集群(三主三从,以及扩容、缩容)
  • flink的window和windowAll的区别
  • list转map(根据某个或多个属性分组)