float中的疑惑,该如何处理

float中的疑惑
float a=1.0f;
 cout<<(int)a<<endl;
 cout<<(int&)a<<endl;
 cout<<boolalpha<<((int)a==(int&)a)<<endl;
 float b=0.0f;
 cout<<(int)b<<endl;
 cout<<(int&)b<<endl;
 cout<<boolalpha<<((int)b==(int&)b)<<endl;
为什么是结果是
1
1065353216
0
0
false
true

------解决方案--------------------
cout < <(int)a < <endl; //强制转换,损失掉了精度,变成1
cout < <(int&)a < <endl; //后面说
cout < <boolalpha < <((int)a==(int&)a) < <endl; //这个输出的表达式的值,==左边显然不等于右边,
float b=0.0f; 
cout < <(int)b < <endl; //强制转换,去掉精度
cout < <(int&)b < <endl; //后面说
cout < <boolalpha < <((int)b==(int&)b) < <endl; //后面说
===========================================================
关于(int) 与(int &)做强制转换的问题:

float 1.0在内存中存储为: 
符号位 阶(指数) 尾数 
0 01111111 00000000000000000000000 

关于浮点数存储可以参见有关标准。 

转化为int&后,数据就变为00111111100000000000000000000000 = 1065353216 


------解决方案--------------------
当使用如(int)a进行转换时,编译器会构造一个匿名对象,并执行从float到int的转换过程,将结果保存到匿名对象的内存中,于是最后输出的是这个经转换后的匿名对象的值。当进行如(int&)a这样的强制转换时,实际上,编译器并没有为你构造匿名对象,而是将a这个对象(本身是浮点类型的)的实际类型(float)"看做"int类型来处理,它们都处理同一个内存位置,也就是a原来的位置,当输出(int&)a这样的值的时候,会输出3FC0000(使用hex方式输出)。
因为:对于a=1.0f, (int)a 实际值为1,而(int&)a的实际值为3FC0000,所以它们自然不是相等的。而0.0f的内存表示和整数类型的0在内存中的表示都是0。所以,在比较(int)0和(int&)0时,它们的结果是相等的!

如果lz对上面解释中的细节问题还是不懂,推荐看这篇文章!
http://blog.csdn.net/biblereader/archive/2006/06/21/819428.aspx