深度剖析数据在内存中的存储2——浮点数数在内存中的存储

根据国际标准IEEE:任意一个二进制浮点数V可以表示为下面形式:
(-1)^SM2^E:
(-1)^S表示符号位,当S为0,V为正数;当S为1,V为负数。由其物理结构决定了,浮点数为有符号数。
M为有效数字,大于等于1,小于2。
2^E表示指数位。
eg:5=>0101=>(-1)^01.012^2. S=0,M=1.01,E=2
规定:对于32位的浮点数(单精度浮点数存储),最高1位是符号位(S),接着的8位为指数位(E),剩下的23位是有效数字位(M),不满23位后面补0。
对于64位的浮点数(双精度浮点数存储),最高1位是符号位(S),接着的11位为指数位(E),剩下的52位是有效数字位(M)。
对于有效数字M和指数E会有一些特殊规定:
1、因为1<=M<2,所以小数点前必定是1,所以可以省略1和小数点,这样一来,对于单精度浮点数存储方式,23位有效数位存的都是小数部份数。读取时,小数点和1都会被自动加上。等于可以保留24位有效数字。双精度同理。
2、对于指数E来说,首先说明他是一个无符号整数,对于单精度浮点数存储方式,E共占8位,则E的取值范围为0~255。但是科学记数法中,指数是可以为负数的,所以规定,存入内存时,E的真实值必须加上一个中间数,对于8位的E,这个中间数为(255/2=)127(实际表达范围-127~128),对于11位的E,这个中间数为1023(实际表达范围-1023~1024)。取数时,再减去127/1023即为实际值。(移码)
eg. 由上面可知,5的指数为2,对于单精度浮点数存储方式,实际在内存中存储的数为127+2=129=>1000 0001。
注意:因为当E为全零时,实际上指数为-127,表示一个接近零很小的数,因此浮点数不能与零比较,用精度来代替。当E为全一时,表示的±无穷大。
综述:整数与浮点数的存储方式完全不同,整数存取为原反补码,浮点数为S、E、M
练习代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main()
{
    int n = 9;                        //0000 0000 0000 0000 0000 0000 0000 1001
    float pFloat = (float)n;          //将9取出,转为浮点型,再存给pFloat
    float *pfloat = (float *)&n;      //将n的地址转为浮点数地址(即看待n的方式变为浮点数)。
    printf("n=%d\n", n);
    printf("pFloat=%f\n", pFloat);
    printf("*float=%f\n", *pfloat);   //解引用后以浮点数形式看待空间里的值  0 00000000 00000000000000000001001   S=0,E=0,(-127)
    *pfloat = 9.0;                    //1001 实际n空间中存的值0 00000011 00100000000000000001001
    printf("n=%d\n", n);              //转换为整数为 1091567616
    printf("*float=%f\n", *pfloat);   // 9.000000
    system("pause");
    return 0;
}

原文地址:https://blog.51cto.com/14240895/2385761

时间: 2024-11-07 15:09:16

深度剖析数据在内存中的存储2——浮点数数在内存中的存储的相关文章

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

深度剖析数据在内存中的存储1——数据类型

基本内置类型:char,short .int. long. long long .float.double.Ps:C语言没有字符串类型,字符串通过字符数组结尾\0表示.类型意义:1:使用该类型决定开辟内存空间大小(大小决定了适用范围).2:决定如何看待内存空间的视角.(eg:char x=1 这个1表示对应asc的字符int x=1 就是整数1).类型归类:整型:(无说明默认都为有符号整数)1.char:unsigned char.signed char2.short:unsigned shor

【嵌入式开发】裸机引导操作系统和ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )

[嵌入式开发]ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 ) 一. 内存 简介 1. 两大内存分类 ( 1 ) DRAM 简介 ( 定期刷新 | 速度慢 | 成本低 ) DRAM 简介 : 1.硬件描述 : DRAM 基本由一个个小电容基本原件组成, 电容的两端保留电荷; 2.优缺点描述 : ① 优点 : 成本很低, 很便宜; ② 缺点 : 需要 定期刷新数据, 速度较慢; a.

eclipse中console的输出行数控制

eclipse中console的输出行数控制 开发中,会遇到当输出大量的sql语句或者错误的时候,往往会因为console输出的限制而不能完整显示,所以我们自己就需要迫切的增加显示的行数,这样 就可以通过控制台输出的信息来查看错误的原因,从而解决问题. 第一步,当项目运行时,点击console输出框,右键选择"preferences"如下图所示 第二步,选择了之后,在弹出框中,找到"limit console output",如果是选中的话就把前面的选中取消掉. 综

菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t[转]

菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Nov 11th, 2014 今天是一年一度的光棍节,还没有女朋友的程序猿童鞋不妨new一个出来,内存管理一直是C/C++中最棘手的部分,远不止new/delete.malloc/free这么简单.随着代码量的递增,程序结构复杂度的提高.今天我们就一起研究一下以精巧著

菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t[转]

菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Nov 14th, 2014 1.共享内存 共享内存是Linux下提供的最基本的进程通信方法,它通过mmap或者shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者shmdt系统调用释放这块内存,使用共享内存的好处是多个进程使用同一块内存

浮点数如何在内存中存储

首先,将10进制的小数0.1转换为二进制,方法如下: 0.1*2==0.2  取0.2的整数部分, 结果为0.0 0.2*2==0.4  取0.4的整数部分, 结果为0.00 0.4*2==0.8  取0.8的整数部分, 结果为0.000 0.8*2==1.6  取1.6的整数部分, 结果为0.0001 0.6*2==1.2  取1.6的整数部分, 结果为0.00011 0.2*2==0.4  取0.4的整数部分, 结果为0.000110 最后这一步开始循环,因此0.1的二进制为数为: 0.00

java6,7,8中字符串池的进化史与深度剖析

这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整. 字符串池 字符串池(有名字符串标准化)是通过使用唯一的共享 String 对象来使用相同的值不同的地址表示字符串的过程.你可以使用自己定义的 Map<String, String> (根据需要使用 weak 引用或者 soft 引用)并使用 map 中的值作为标准值来实现这个目标,或者你也可以使用 JDK 提供的 String.intern().

深度剖析Zabbix Web scenarios数据表结构

深度剖析Zabbix Web scenarios数据表结构 前言 因开发需求,需要解析Zabbix web监控数据表结构:因为网上关于Zabbix数据表结构解析的比较少,所以心血来潮写了一篇作为记录. 突破口 对Zabbix数据库表结构做解析的时候,我有个习惯,直接针对某个itemid怼. 这次当然不例外,随便找了个Zabbix web itemid. 直接查数据库里有哪些表 show tables like "%http%"; +---------------------------