为什么浮点数强制转换成整形会发生错误
本帖最后由 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