IEEE754标准中,浮点数的内存布局

以下仅以float(内存中占据4个字节,32bits)来说明,double(8个字节,64bits)同理,只是有细微的差别。

float的内存分布

IEEE754规定,32bit的float在内存中是这样分布的:

符号位(S) 阶码(E) 尾数(M)
1 8 23

整数、浮点数在内存中都是以二进制的形式存在的(补码),而浮点数是二进制下的科学计数法存储在内存中的。可以表示 为:$ s 1.m^e$

  • 符号位占据一个比特,当S = 0时表示正数,当S = 1时表示负数。
  • 阶码e则是其指数再加上一个偏移量(127)后的数,其总共占据了8个字节,8位无符号数的范围是0~255,考虑到已经加了一个偏移量,则其实际可表达的范围是-128~127(这个范围是指二进制计数法下的范围)。
  • 尾数m占据了23个字节,由于是使用的二进制下的科学计数法,所以任何浮点数(除了0)都隐含了一个1,也就是说,其尾数实际上在前面应该再加一个1,即:1.m,这样,浮点数的二进制精度是24位,而$2^{24} = 16777216$,所以其十进制下的精度是7位有效数字。
计算实例

1, 十进制与二进制的互转
二进制转十进制比较简单,就是对应位乘以对应的2的幂次,比如:101.1011,其转换过程为:
$$1*2^2 + 0 * 2^1 + 1 * 2^0 + 1 * 2^{-1} + 0 * 2^{-2} + 1 * 2^{-3} + 1 * 2^{-4}$$
十进制整数转二进制比较简单,一是8421来凑,一是除2倒序排,不再解释。
十进制小数转二进制,就是一直乘2,如果大于1,则置1,如果小于1,则置0,一直乘2,直到为0或达到指定位数为止。
比如0.125:
$$ 0.25 * 2 = 0.5 --- 0 \\ 0.5 * 2 = 1 --- 1$$
则其二进制为:0.01。
再比如:0.632:
$$ 0.632 * 2 = 1.264 --- 1 \\ 0.264 * 2 = 0.528 ---0 \\ 0.528 * 2 = 1.056 ---1 \\ 0.056 * 2 = 0.112 ---0 \\ ...$$
则其二进制为:0.1010….。
2, 计算float的内存布局
2.1 考虑float fa = 4.25,那么:int ia = *(int*)&fa是多少呢?
我们知道,4.25 = 100.01,化成指数表示为:$1.0001*2^2$,则其符号位S = 0, 阶码e = 2 + 127 = 0x81,其尾数部分二进制表示为:1000 1000 0000 0000 0000 0000,总共24位,将尾数的最高位的1去掉,再与阶码e,符号位S组合后:

符号位(S) 阶码(E) 尾数(M)
0 1000 0001 000 1000 0000 0000 0000 0000

合起来就是:
0100 0000 1000 1000 0000 0000 0000 0000,即:ia = 0x40880000
2.2 再考虑float fa = -0.0125,那到:c++ int ia = *(int*)&fa是多少呢?
-0.0125 = -0.00000011001100110011001100...,转换成指数为:$-1.10011001100110011001100…*2^{-7}$,则其符号位S = 1,阶码e = -7 + 127 = 0x78,其尾数部分用二进制表示为:1100 1100 1100 1100 1100 1101,后面的位数就被四舍五入截断了,由于最后一位的后一位是1,则向前进1,同样保留24位,将其最高位的1去掉,再与阶码和符号位组合:

符号位(S) 阶码(E) 尾数(M)
1 0111 1000 100 1100 1100 1100 1100 1101

全起来就是:
1011 1100 0100 1100 1100 1100 1100 1101,即:ia = 0xbc4ccccd

如果将ia转换成fa,则转换过程相反。

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/beichen2012/p/5756321.html

C++ float的内存布局相关推荐

  1. [C++对象模型][6]sizeof与对象内存布局

    有了前面几节的铺垫,本节开始摸索C++的对象的内存布局,平台为windows32位+VS2008. 一 内置类型的size 内置类型,直接上代码,帮助大家加深记忆: Code void TestBas ...

  2. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  3. 理解Java对象:要从内存布局及底层机制说起,话说....

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上 ...

  4. JVM_04 对象的实例化+内存布局+访问定位+直接内存

    一.前言: (1).new 最常见的方式 | 变形1 : Xxx的静态方法 | 变形2 : XxBuilder/XxoxFactory的静态方法 (2).Class的newInstance():反射的 ...

  5. JVM运行时结构、Java内存管理、JVM实例、HotSpot VM对象的创建、内存布局和访问定位

    1.JVM运行时结构 Java 运行时数据区域有程序计数器.Java虚拟机栈.本地方法栈.Java堆和方法区.其中前三个线程私有,随线程生而生,线程灭而灭:后面两个是线程间共享. 1.1 程序计数器 ...

  6. C字节对齐与C++类对象内存布局

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  7. java 对象压缩_理解Java对象:要从内存布局及底层机制说起,话说....

    前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:< 这篇文章主要 ...

  8. java char占用多少字节_Java虚拟机:Java对象大小、对象内存布局及锁状态变化

    一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个 ...

  9. 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...

最新文章

  1. ftp主动和被动模式_【扫盲】FTP基础知识详解
  2. UVA11817 Tunnelling the Earth(计算几何、经纬度转空间坐标、球面距离)
  3. 小米面试题:合并二叉树
  4. [ACTF2020 新生赛]Upload
  5. Python多线程学习教程
  6. MySql隔离级别多线程并发读取数据时的正确性
  7. pacman安装ubuntu_最受欢迎的Linux发行版, Manjaro Linux虚拟机安装折腾全记录
  8. Matlab - 文件目录路径操作
  9. 忽略字母大小写情况下统计字符出现的次数
  10. 自动化测试辅助工具——FirePath
  11. 【JAVA】java代码实现print2Flash转swf文件,百度文库一样。
  12. cad快看_CAD中遇到文件损坏,别着急,这几招能帮你挽回损失
  13. bootstrap可视化布局(免费,自定义,方便下载)网页自定义,后台、前端页面自定义
  14. 多路测量实时同步工作原理_数字示波器原理
  15. iOS-image图片旋转方向
  16. eclipse MAVEN插件正确使用方式。
  17. 中国石油大学(北京)-《汇编语言程序设计》第一阶段在线作业
  18. Linux | 可重入函数 | volatile | SIGCHLD信号
  19. win10控制面板快捷键_在win10打开注册表编辑器的七种方法,你知道几种
  20. 安装python3缺少db4-devel

热门文章

  1. Ubuntu18.04如何让桌面软件默认root权限运行?
  2. Java之泛型T T与T的用法
  3. Android 中文 API (16) —— AnalogClock
  4. Linux高级文本处理之sed(三)
  5. JS引用类型 -- Array类型
  6. Appium移动自动化测试之获取appPackage和appActivity
  7. phpcms2008常用函数
  8. Hadoop分布式文件系统:架构和设计要点
  9. WCF分布式开发常见错误(10):套接字连接中断,The socket connection was aborted
  10. layui radio 根据获取的到值选中