参考:http://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html
参考:http://zh.wikipedia.org/zh-cn/IEEE_754
截取1:
转
关于32位浮点数的结构,你可以看我的btlog当中的描述部分
http://btlog.csdn.net/happy_888
根据IEEE的标准,浮点数的定义如下
符号位 指数位 小数部分 指数偏移量
单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127
双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023
我们以单精度浮点数来说明:
符号位,表述浮点数的正或者负
指数实际也有正负的,但是没有单独的符号位,而是采用了一个偏移来表示
在计算机的世界里,进位都是二进制的,指数表示的也是2的N次幂
这个数据格式当中的,指数是8位,可表达的范围是0到255
而对应的实际的指数是-127到+128
这里特殊说明,-127和+128这两个数据在IEEE当中是保留的用作多种用途的
-127表示的数字是0
128和其他位数组合表示多种意义,最典型的就是NAN状态
小数部分,并不是一个浮点数的实际的小数
实际的小数在这个小数前面还保留了一个1
拿浮点数1.0来说
符号位是0, 实际指数是0,对应这里的指数就是127了,也就是0x7f
而小数部分就是1.0了, 1是暗含的不存储,实际的小数部分就是0了
因此组合起来的数据就是,0x3f80000
16位的也是类似的,自己分析一下
WORD w = *((WORD*)(&f))
是把一个浮点数按照内存结构转化成为一个unsigned int 16位的结构
TC 2.0不是C++ ,是c++的话就可以简单 w = (int&) f; 就可以了
截取2:
long类型可以隐式转换为float类型。
隐式转换也叫自动类型转换,即当我们要将一个变量类型中的值赋给另外一种类型的变量时,如果被赋值的变量字节大小大于准备赋值的变量字节大小,就可以自动转换成被赋值的变量类型。
但是这里long是8个字节,而float是4个字节,为什么反而能隐式转换呢?
两者表示数据的方式不一样,float采用IEEE的表示法,而long是用位数来控制的范围。
long和float从根本上讲它们表示的不是一类数,前者是精确值,而后者是非精确值。
float的字节宽度没有long大,但它的表现值宽度要宽得多,因此long到float是没有问题的。
long -9.2*10^18 ~~ 9.2*10^18
float -3.4*10^38 ~~ 3.4*10^38
可以看出来float表示的范围要比long的范围大,尽管float的位数少。
所以,占用内存多不表示它允许的取值范围大,long隐式转换成float只可能发生精确度下降,但不会导致数据丢失。
浙公网安备 33010602011771号