32位字长浮点数:
共32位
1 |
8 |
23 |
符号位 |
解码 |
尾数 |
0 + 1 - |
移127码 |
原码,隐含小数点前的首位1 |
不同数据类型之间转换时,隐藏着一些不容易被察觉的错误,比如int 和 unsigned
1. int 2 float时,有效数字可能舍去。
2. int转为double时,理论上是安全的
3. double转为float时,可能发生溢出,数据可能被舍入。
4. 32位架构unsigned int经验上限:2^32 -1 = 4294967295 // 42亿9千万
特别的:
1. 全0解码全0尾数: +0和-0,+/-取决于符号位
2. 全0阶码非全0尾数:非规格化数
用于处理阶码下溢,使得出现比最小规格化数更小的结果时,程序能继续运行。
3. 全1阶码全0尾数: +无穷或负无穷,取决于符号位。
可能按NaN,非数处理
也可能产生明确的结果。
4. 全1阶码非0尾数:NaN
非数,NaN,根据尾数最高位的不同决定是否进行异常处理。
5. 阶码非全0非全1:规格化非0数
因为特殊值的存在,除去全0全1解码后,单精度阶码个数为254,最大阶数为127。
C语言中 float 和 double 分别对应IEEE753的单精度和双精度。
但 long double 要根据处理器微架构做改变。
比较新的新事物尚未有统一标准。
补充:Intel采用80位双精度扩展格式(Long double),相比IEEE754,它的尾数没有隐藏位,有效位共64位。
可以在这个网站在线调试运行结果。