c++中浮点数的存储方式
来源:互联网 发布:大疆无人机 知乎 编辑:程序博客网 时间:2024/03/29 14:55
c++中浮点数的存储方式
最近闲来无事,一直搞不懂float类型在内存中是怎么存储的,于是潜心研究了一下,以下是一些心得:
开始之前,先简单的说一下float的四字节32位二进制分别代表的意义:
1:符号位 0正1负
2->9:阶码 0111 1111
10->32:尾码 其实就是小数点移动后,去掉左边1剩余的数(这儿可能说的不是很清晰,后面我会举例说明,很容易理解的)
以上三个名字其实不重要,理解它们所代表的含义即可,下面开始正题:
我这儿以12.25为例说明浮点数在内存中的存储方式
1.首先将12.25转换为二进制12.25->1100.01(其余各位用0填充,这儿为了清晰起见,就省略了)
2.移动小数点,例如12.25移动后为1.10001,去掉小数点左边的1,剩余的即为伪码.但是这儿由出现了一个新的问题,我们怎么区分小数点的左移和右移呢,编译器在这儿采用了一个非常巧妙的方法,利用127进行区分,如果小数点向左移动,就加上127,向右移动就减去127,即左加右减.这样就可以区分了...可能这儿说的还不是很清楚,下面会有我写的图示.
0 0111 1111->阶码
0 0000 0011 1000 1000 0000 0000 0000 0000 //蓝色为符号位,红色为移码(12.25在这儿左移了三位),绿色为伪码
0 1000 0010 1000 1000 0000 0000 0000 0000//利用上面的左加右减得出 这就是浮点数在内存中的存储方式
即0100 0001 0100 0100 0000 0000 0000 0000,转换成十六进制即为0x41440000(这块都是0,对结果没影响,如果不是0,就会有误差,这也就可以解释为什么浮点数只是一种近似存储方式)
我们在编译器中对其进行验证...
经过验证结果是正确的...
同理我们知道浮点数1.0在内存中的存储方式为0x3F800000 大家可以自行验证
double类型同理,大家可以自己试试...
- C/C++中浮点数的存储方式
- 浅谈C/C++中浮点数的存储方式
- c语言中浮点数的存储方式
- c++中浮点数的存储方式
- c++中浮点数的存储方式
- 计算机中浮点数的存储方式
- 浮点数在C/C++中存储方式
- C语言中浮点数在内存中的存储方式
- C语言中浮点数在内存中的存储方式
- 浮点数的存储方式
- 浮点数的存储方式
- 浮点数的存储方式
- C/C++的浮点数在内存中的存储方式
- C语言浮点数的存储方式(转)
- C语言浮点数存储方式
- 浮点数在计算机中存储的方式
- 浮点数在计算机中存储方式
- 浮点数在计算机中存储方式
- Android TextView文字横向自动滚动(跑马灯)
- 作用域和 this
- 类加载器学习
- raw格式(裸数据)格式文件读写
- VHDL TestBench数据产生方式
- c++中浮点数的存储方式
- 斯特林数的研究
- 使用SSH时提示 ”Server responded "Algorithm negotiation failed"
- 数据库ID---转载自http://www.cnblogs.com/kissdodog/archive/2013/05/28/3102862.html
- MVC,MVP,MVPVM(二)提升效率之Templates
- acm 弱渣不会水题(1)--(HDU 2501)
- ORACLE概要文件
- 安装VirtualBox的时候遇到的问题
- Python标准库(三)