C++中float用32位来表示,f = (-1)^S * T * 2^E,S是符号位,T是尾数,E是指数
首先我们把f表示成科学计数法的形式,然后再写出其在内存中的表示,在这里T写成1.XXX的形式,所以可以表示24位尾数
举例来说 f = 14.25f = (1110.01)B = (1.11001*2^3)B 所以符号位S = 0, T = 11001B, E = 3 = 11B
另外指数可以为负数,在C++中,是把指数加上127来存储的,即E= E+ 127 = 130 = 10000010B
即 
 
在x86系统中,小端模式,因此在内存中的存储为0x00|00|64|41
 
那么我们可以计算一下C++中float表示的范围了,可以先列出S,T,E的取值范围
S = 0 或者1
T = 最小0 最大 1-2^-32
S = 最小-127 最大128
绝对值最大为 ABSMAX = [1-(2^-32)]* 2^128 约等于 3.4E+38
绝对值最小为  ABSMIN = 1.0 * 2^(-127)
所以取值范围是 [-ABSMAX, -ABSMIN] 和 [ABSMIN, ABSMAX]
 
另外对于0.0f,内存中是以全0表示
 
附float与int之间的转换,首先需要说明的是int与char在C++中都是以补码形式存储
int->float 
把int写成科学计数法形式,比如 i = -128 = -1.0*(2^7) B 所以符号位S = 1, T = 0B, E = 7 = 111B
E = E+ 127 = (10000110)B
在x86系统中,小端模式,因此在内存中的存储为0x00|00|00|C3,而int类型的存储为0x80|ff|ff|ff(补码形式)
注意在整个过程中int要进行右移操作,int有1位符号位,31位数字位,但是float只有24位尾数,所以可能造成精度下降
float->int
int表示的范围是[-2^31, 2^31-1],因此只是落在此范围中的float转成int有实际意义,否则结果是未可知的
float数字位f = (-1)^S * T * 2^E, 令T = 1.T,然后根据指数E对T进行移位操作即可,最后根据符号位S判断结果的正负
对于f = 0,内存中以全0表示,需要单独处理
代码如下
float f = ;
//*(int *)(&f) = 0xFFFFFF;
int p = *(int *)&f;
//尾数 当然与真实的尾数左移了23位
int t = (p & 0x7FFFFF) | 0x800000;
//指数
int e = (p >> ) & 0xFF;
//符号位
int s = p >> ;
if(e - < - || e - > )
{
printf("结果不可知\n");
}
e = e--;
if(e > )//左移
p = t << e;
else if(e < )//右移
p = t >> -e;
if(s < )
p = -p;
if(f == )
p = ;
在上述代码中,不管是左移还是右移当移动次数大于等于32时,会得到意想不到的结果,实际上有如下结论
如果被移动对象的长度是n位,那么移动计数必须大于等于0,并且严格小于n。
对于宽度为m的类型, 在X86上运行,移动次数为n,若n>=m,结果相当于移动 n&(m-1) 次
若n < 0, 则存在最小的k,使得k*m + n = n' > 0,相当于移动n'次
 
 

C++中float类型的存储的更多相关文章

  1. JavaScript中Float类型保留两位小数

    JavaScript中Float类型保留两位小数 核心方法: num:要操作的数字     size:要保留的位数 parseFloat(num).toFixed(size); 实现代码如下:var  ...

  2. JS中Float类型加减乘除 修复 JQ 操作 radio、checkbox 、select LINQ to SQL:Where、Select/Distinct LINQ to SQL Count/Sum/Min/Max/Avg Join

    JS中Float类型加减乘除 修复   MXS&Vincene  ─╄OvЁ  &0000027─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄Ov ...

  3. mysql中float类型使用总结

    对于单精度浮点数Float:  当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定,没有发现有相关的参数设置建议:将float改成dou ...

  4. 数据库中float类型字段,转化到前端显示,统一保留两位小数

    客户的一个需求,mybatis查询到的数据库的数据进行转换,采用TypeHandler<T>的方式.float保留两位精度可以采用DecimalFormat 直接贴上最终的解决代码(事情没 ...

  5. JS中Float类型加减乘除 修复

    MXS&Vincene  ─╄OvЁ  &0000027─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好, ...

  6. JS中Float类型加减乘除

    //浮点数加法运算 function FloatAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1]. ...

  7. 使用SqlServer中的float类型时发现的问题

    在做项目中,使用了float类型来定义一些列,如:Price,但是发现了很多问题1.当值的位数大于6位是float型再转varchar型的时候会变为科学技术法显示    此时只好将float型转换成n ...

  8. C/C++中float和double的存储结构

    int main (int argc, char **argv) { float a = 1.0f; cout <<"(int&)a = "<<(i ...

  9. 当向计算机中存入一个float类型的数值2.2 后,在从计算机中读出输出,这时2.2 的值已经发生了变化(转)

    problom : 'f1' value hava been changed when output. reason : the binary repersentation of 2.2f is : ...

随机推荐

  1. flask第二十篇——模板【3】

    请关注公众号:自动化测试实战 现在我们通过查询字符串的方式给render_template传参,我们就要用到flask库的flask.request.args.get()函数先获取参数,在index. ...

  2. 隐藏控件HiddenField使用

    HiddenField控件顾名思义就是隐藏输入框的服务器控件,它能让你保存那些不需要显示在页面上的且对安全性要求不高的数据. 增加HiddenField,其实是为了让整个状态管理机制的应用程度更加全面 ...

  3. 异步加载JS几种方式

    默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很大的javascript,如果放在页 ...

  4. 错误:Authentication with old password no longer supported, use 4.1 style passwords.

    今天重新装了系统,mysql connector 使用了官网的最新版本(6.8.3). 启动项目出现标题中的错误.原因大家谷歌. 解决方法,使用低版本的 connector. 我使用的是 6.5.6 ...

  5. wordpress域名解析到了网站,但是点击其他页面会出现ip而不是域名

         1.前提域名可以访问你的网站证明解析没问题 2.那就是wp后台的设置问题,将url和站点url改为你的域名http://www.eovision.cc清理缓存即可 亲测可用,如果改了出现页面 ...

  6. Ipython notebook 一些技巧

    在模块后面输入:?,运行可以显示说明: 输入:??,运行可以显示源代码. 输入%matplotlib inline将matplotlib库导入,要显示的图片就可以嵌入到网页中了 %prun用于代码的执 ...

  7. HDFS(一)

    HDFS的概念 HDFS首先是文件系统(FileSystem,FS),尽管这个FS是基于OS原生的文件系统之上:而且这个文件系统是一个抽象概念,HDFS作为一个整体出现,对外(client)隐藏了其内 ...

  8. 【转载】探寻C++最快的读取文件的方案

    原文地址:https://www.byvoid.com/blog/fast-readfile/ 在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式.相信几乎所有的C++学习者 ...

  9. Android.mk语法解析

    Android.mk 相当于 Linux 中的 Makefile 文件,用来向安卓系统描述如何编译源代码.该文件会被编译器解析多次,所以尽量减少在 Android.mk 中声明变量. Android. ...

  10. websphere删除概要文件(profiles)的方式

    [b]删除概要文件:[/b]方案一:1.找到profileRegistry.xml,在目录IBM\WebSphere\AppServer\properties里,去掉想删除的profile的配置即可. ...