终于知道 “强制引用转换”有什么用了
做了个小试验:
main()
{
int a=1090781184;
cout < <(float&)a; //主要是试验(float&)的作用
system( "pause ");
}
以上程序打印结果是8.25
首先分析下 :变量a的值
1090781184=0x41040000h=0100 0001 0000 0100 0000 0000 0000 0000
然后根据浮点数标准IEEE754: 32位的float
----------------------------------
31位 30到23位 22到0位
符号位 (指数:介码:把补码符号位取反再减去1) 尾数(小数,原码表示)
---------------------------------
0100 0001 0000 0100 0000 0000 0000 0000 实际上是:
符号:+(为正) 指数: 3(10进制) 尾数:0.0001+1 (1为缺省)=1.00001(2进制)
0 100 0001 0 000 0100 0000 0000 0000 0000
合并起来为: +1.00001e3=1000.01
然后换算为10进制:8.25
所以 (float&) 的作用为让编译器把 int变量a 所在的内存 解释为float类型
也就是说这个内存区域 如果把他当着int类型来翻译 他上面的值就是1090781184
如果作为double类型来翻译他的值就是8.25
这也是变量的3要素的知识点
[解决办法]
楼主真用功啊,顶!
[解决办法]
还是有一些不明白,指数为什么是3,尾数又是如何得来的不懂。不过还是挺佩服楼主的。
[解决办法]
学习
编译器以不同的方式去读取相同的内容 是这个意思吧
[解决办法]
介码???只听说过反码是补码减一取反得来的。
有符号数在电脑里的存储方式都是以补码的形式存在,怎么有一个介码呀?
[解决办法]
mark
[解决办法]
good
[解决办法]
指数是3很简单,IEEE单精度浮点数格式中阶码的存储都是127移码,对与本例来说,10000010的十进制是130,减去127,自然就是3了。尾数的计算其实是在阶码之后有一个隐含的1,所以尾数才是1.00001,当然后面全是0,我们也就不写了,事实上在做浮点运算时,后面的位很有可能是随机值
[解决办法]
不错,学习了。:)
引用在很大程度上跟指针相通,因此“(float&)a”跟“*(float*)&a”结果一样也就不足为怪了。
它们应该都相当于reinterpre_cast的效果。
[解决办法]
功底强悍啊!学习了,记得学组成原理的时候对这个挺清楚的,转眼间忘了
[解决办法]
学习 (float&)a *(float*)&a
[解决办法]
xuexi
------解决方案--------------------
楼主强人啊
