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

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

愿所有美好如期而遇



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

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,表示一个非常大的数据。

目录
相关文章
|
10天前
|
存储 缓存 中间件
|
4天前
|
存储 Java 程序员
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
26 10
|
19小时前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
23 14
|
4天前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
15 0
|
5天前
|
存储 安全 Java
Java面试题:如何在Java应用中实现有效的内存优化?在多线程环境下,如何确保数据的线程安全?如何设计并实现一个基于ExecutorService的任务处理流程?
Java面试题:如何在Java应用中实现有效的内存优化?在多线程环境下,如何确保数据的线程安全?如何设计并实现一个基于ExecutorService的任务处理流程?
10 0
|
5天前
|
安全 Java 调度
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
7 0
|
5天前
|
安全 算法 编译器
C++一分钟之-内存模型与数据竞争
【7月更文挑战第10天】了解C++11内存模型对多线程编程至关重要。它定义了线程间同步规则,包括顺序一致性、原子操作和内存屏障。数据竞争可能导致不确定行为,如脏读和丢失更新。可通过互斥量、原子操作和无锁编程避免竞争。示例展示了`std::mutex`和`std::atomic`的使用。掌握内存模型规则,有效防止数据竞争,确保多线程安全和性能。
11 0
|
21天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
24 2
|
24天前
|
存储
数据在内存中的存储(2)
数据在内存中的存储(2)
27 5
|
24天前
|
存储 小程序 编译器
数据在内存中的存储(1)
数据在内存中的存储(1)
31 5