分类: C/C++
2015-06-02 21:22:59
(int&)a:将a的引用强制转换为整型,意思是a所在的内存,本来定义的时候为float类型,并初始为1.0f,
但现在我要按int类型解释这段内存(也就是说a所在的内存地址中的数据本来是按float型存储表示的,你非要按int型来解释不可)。
标准ieee745提出数字系统中的浮点数是对数学中的实数(小数)的近似,同时该标准规定表达浮点数的0、1序列被分为三部分(三个域):
以32位单精度浮点数为例,其具体的转换规则是:首先把二进制小数(补码)用二进制科学计数法表示,比如上面给出的例子1111101.001=1.111101001*2^6。符号位sign表示数的正负(0为正,1为负),故此处填0。exponent表示科学计数法的指数部分,请务必注意的是,这里所填的指数并不是前面算出来的实际指数,而(exponent)是等于实际指数加上一个数(指数偏移127),偏移量为2^(e-1)-1,其中e是exponent的宽度(位数)。对于32位单精度浮点数,exponent宽度为8,因此偏移量为127,所以exponent的值为133,即10000101。之后的fraction表示尾数,即科学计数法中的小数部分11110100100000000000000(共23位)。因此32位浮点数125.125D在计算机中就被表示为01000010111110100100000000000000。
对于32位单精度浮点数,sign是1位,exponent是8位(指数偏移量是127),fraction是23位。对于64位双精度浮点数,sign是1为,exponent是11位(指数偏移量是1023),fraction是52位。
所以 1.0f=1.0*2^0;--->sign=0;exponent=127+0=127=01111111;fraction=0000000000000000000000(32bit);所以整个1.0f:001111111000000000000000000000000000,看成普通整数,表达成十进制是2^29+2^28+...+2^23=1065353216