c或c++中int转float中在printf中的问题

来源:互联网 发布:数据流程图画法 编辑:程序博客网 时间:2024/04/28 15:42

先看下面代码:

int main()
{
    int a = 200;
    printf("%lf", a);
}



刚看到这个结果的时候蒙了,难道不应该是200.000000吗?

然后查了下float的存储结构:float在计算机中存储分符号位部分,指数位部分,位数位部分;0-22位存储尾数位,23-30位存储指数位,31位符号位。注意指数位的基数是127,实际的指数大小,需要将30-23位的数值减去127。

上述程序中a在内存中存储为:0000 0000 0000 0000 0000 0000 1100 1000。因为在C语言中没有重载函数这么一说,那么在printf("%lf", a)这个语句中就直接把a在内存中的表现形式作为float的表现形式。那好,0000 0000 0000 0000 0000 0000 1100 1000  符号位为0,表示正数;指数位为0-127=-127;位数部分为1.000 0000 0000 0000 1100 1000  

那么就是float的表现形式就是  1.000 0000 0000 0000 1100 1000   *  2^(-127);

表示1.000 0000 0000 0000 1100 1000 这个二进制数要向左移动127位!!这是一个极端,为了说明问题,我们再看一下另外的一个极端

假设上述的 a = 2000000000(20亿),二进制表示方法为:0111 0111 0011 0101 1001 0100 0000 0000 ,这个指数应该是2^(238-127)=2^111表示要把1.011 0101 1001 0100 0000 0000   这个二进制数向右移动111位。

以上说明是准确的,下面开始我的胡言乱语,,,,,,

于是我猜测编译器为了解决上述极端问题规定,无论什么整数直接打印为float或是double时,都显示为0。

printf在执行时不会进行类型转换。




于是再执行下面代码:


现在运行正确了;在这个程序内,float b = a这个语句实际上就进行时隐式类型转换,这个语句的执行不会像printf里面那样直接把a内存中的32位数解释为float,重新把200转换成float在内存中以上述方式存储,于是就看见了上述显示的结果。


那么反方向呢?


现在这个应该很好理解了:200以float在内存中存储为:0100   0011  0100  1000   0000   0000  0000  0000  。那么printf时候直接解析该内存值为int类型的值,

这样输出的数是一个非常大的值,于是(以下猜测,我只能这么理解......)和上面一样,编译器遇到了这样的转换,就直接输出0

0 0
原创粉丝点击