首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

为什么浮点数强制转换成整形会发生异常

2013-02-27 
为什么浮点数强制转换成整形会发生错误本帖最后由 zjtzlqr 于 2013-02-19 09:38:56 编辑#include stdio.h

为什么浮点数强制转换成整形会发生错误
本帖最后由 zjtzlqr 于 2013-02-19 09:38:56 编辑

#include "stdio.h"
int main(void)
{
float a;
int b;
a=222222222;
b=(int)a;
printf("%d",b);
}


int类型的范围不是 (-2147483648到2147483647)吗  

输出结果为什么会是222222224。
[解决办法]
这个问题需要一步一步来解释:

我们先看看单精度浮点数的格式:
31 30...23 22...0,bit[31]表示符号位,bit[30...23]表示指数位,bit[22...0]表示尾数位。还有一个默认的整数部分为1。

1. float a = 222222222.
222222222 
=> 0b 1101 0011 1110 1101 0111 1000 1110 总共28个bit需去掉4位
=> 1.101 0011 1110 1101 0111 1000 1110 提取整数部分
=> 1.101 0011 1110 1101 0111 1001 [1110]去掉多余的部分且经过了round
开始组合
符号位:0
指数位:27+127(单精度偏置数)= 154= 0b 1001 1010
尾数位:0b 101 0011 1110 1101 0111 1001
最终结果:0b 0 1001 1010 101 0011 1110 1101 0111 1001
上面的结果就是a这个浮点数在内存中的二进制表示。

2. int b = (int)a.
0b 0 1001 1010 101 0011 1110 1101 0111 1001
=> 1.101 0011 1110 1101 0111 1001 乘以 2^27
=> 0b 1101 0011 1110 1101 0111 1001 0000 正数
=> 222222224

热点排行