C++ float的内存布局

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

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

float的内存分布

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

符号位(S)阶码(E)尾数(M)
1823

整数、浮点数在内存中都是以二进制的形式存在的(补码),而浮点数是二进制下的科学计数法存储在内存中的。可以表示 为:$ 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)
01000 0001000 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)
10111 1000100 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用非递归方式实现二叉树中序遍历

先序遍历:中、左、右 中序遍历:左、中、右 后序遍历:左、右、中 比如下面这科树 1 2 3 4 5 6 7 package com.sangfor.tree;public class Node {public int value;public Node left;public Node right;public Node(int value) {this.value = value;} } pac…

读书笔记-互联网思维必读10本书之一《免费》

分享一个读书笔记,具备互联网思维必读10本书之一《免费》,作者克里斯.安德森5年前就能通过“免费”串起众多互联网模式,有些至今还很受用,说明前瞻性思维太重要了

单身的原因终于找到了!原来是这几个......

1 单身的原因(素材来源网络,侵删)▼2 哈利波特:没说过,不是我(素材来源网络,侵删)▼3 我与朋友的健身日记(素材来源网络,侵删)▼4 娘亲给我的床…

概率与统计知识复习

一. 随机变量 1.1 概率分布 概率分布 定义 : 随机变量X取各个值$x_i$的概率称为X的概率分布. 对于离散型随机变量: $ P(Xx_i)p_i, (i1,2,3,...) $ 特性 : a. $p_i>0$ b. $\sum_i^{\infty} p_i 1 $ 累积概率分布(CDF) 定义 : $F(x)P(X \le x) $, 对于离散型随机变量 $F(x)\s…

mathwin.top 联系我们_设计:“有目的”的“因果联系”

什么是设计,康石石估计这是很多同学的疑问,甚至这个疑问会一直拖到从业以后的N多年。 似乎到现在,设计都仍没有一个明确的定义,当然康石石并没有野心试图为设计定义,谨希望通过此篇文章,帮助同学们更加深入…

吴继业:LinkedIn商业分析部如何运用大数据实现商业价值

为什么80%的码农都做不了架构师?>>> 吴继业:LinkedIn商业分析部如何运用大数据实现商业价值 LinkedIn的三大商业解决方案为公司带来了丰厚的利润,这三大解决方案包括人才解决方案、市场解决方案和高级订阅服务。对其内容详细…

用非递归方式实现二叉树后序遍历

先序遍历:中、左、右 中序遍历:左、中、右 后序遍历:左、右、中 比如下面这科树 1 2 3 4 5 6 7 package com.sangfor.tree; public class Node { public int value; public Node left; public Node right; public Node(int value) { this.value = val…

2022年终结版WPF项目实战合集发布

前言在年中, 组织了一个WPF公益视频教程, 在半天内凑集了2W的费用由此启动了该视频录制计划, 到目前为止, 视频教程已经结束。在这里非常感谢参与本次教程以及长期支持的同学, 下面将主要讲解关于本次视频公开的计划以及后期的计划。视频公开计划本次视频合集共58集, 包含了WPF…

vim文本编辑器

vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实现了很多增强功能。vim功能十分强大,具有很多有优点…

第一个发现我嫂子有喜的竟然是......

1 第一个发现我嫂子有喜的竟然是他们家的狗......▼2 有一个温柔的妈妈是什么体验▼3 希望你尊重一下你男朋友▼4 今天考试了不知道各位召唤师考得怎么样了▼5 山东人表示并没有▼6 关键是,你说你没钱他们还都不信▼7 哇!不愧是大师▼7 数学可以…

读书笔记--互联网必读《长尾理论》作者克里斯.安德森

《长尾理论》 1.长尾市场................................................................................................................... 2 2.大热门的兴衰起伏.................................................................................................…

打印二叉树的边界节点

题目: 给定一颗二叉树的头结点head,按照如下标实现二叉树边节点的逆时针打印 标准一: 1、头节点为边界节点 2、叶结点为边界节点 3、如果节点在其所在的层中是最左边或最右边,那么也是边界节点。 例如:如图所示的数 …

@order注解_别再用ifelse了,用注解去代替他吧

来自公众号:咖啡拿铁策略模式经常在网上看到一些名为“别再if-else走天下了”,“教你干掉if-else”等之类的文章,大部分都会讲到用策略模式去代替if-else。策略模式实现的方式也大同小异。主要是定义统一行为(接口或抽象类),并实现…

Oracle 内核参数

安装Oracle的时候,可以参考Oracle 的安装文档,来设置相关内核参数的值,但是有些参数的值还是需要根据我们自己的情况来进行调整。注:不同系统的参数不同,本篇针对linux。 一。Linux 系统下的核心参数 1 # vi /etc/sysc…

SQL Server创建索引(转)

什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K 。为了加快查找的速度,汉语字(词)典一般都…

Asp.NET Core 一个接口的多个实现如何通过 DI 注册?

咨询区 LP13我有三个 Service 类实现了同一个接口,参考代码如下:public interface IService { } public class ServiceA : IService { } public class ServiceB : IService { } public class ServiceC : IService { }我知道像其他的 DI 容器&#xff0c…

Elixir Ecto: 范围数据类型

从 PostgreSQL 9.2 以来, 可以用特定的操作符和函数存储和查询一个值的范围. 这是一个非常不错的特性, 比如在电子商务应用程序方面, 可以用一个字段 price_range 来替代 min_price, max_price 表示一个价格范围.在Ecto中使用范围数据类型 价格范围的表示方法如下 [0, 45.67] …

我们能复活恐龙吗?

全世界只有3.14 % 的人关注了爆炸吧知识鲁迅曾经说过:“不会画漫画的段子手不是好英语老师”咳咳~ 图图君就是这样一位专注知识科普的双语漫画家长按二维码带你去图图君家串串门儿我们到底能不能复活恐龙?长按二维码关注回复“恐龙”寻找答案吧在这里你不…

思考的技术与艺术

总的来说 1.人类的思维充满着各种各样的捷径,每一条捷径都是一把双刃剑。一方面,它降低了大脑的认知复杂性(笼统的看一个问题要比细致的分析简单得多),有助于迅速做出绝大部分时候都正确的判断;但另一方面…

周期串问题(一)

题目: 题目一[周期串问题] 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3) 代码如下: #include <iostream> #include <string> using namespace std;…