这是为何?a=10;double*p=(double*)a;printf("%f"p)却是0.000000
这是为什么?a10double*p(double*)aprintf(%f,*p)却是0.000000本帖最后由 shimachao 于 2012-03-05 2
这是为什么?a=10;double*p=(double*)a;printf("%f",*p)却是0.000000
本帖最后由 shimachao 于 2012-03-05 21:32:31 编辑
#include "stdafx.h"
int main(int argc, char* argv[])
{
int a=10;
double *p=(double*)&a;
printf("%f\n",*p); //结果为0.000000
printf("%f\n",(double(a))); //结果为10.000000
return 0;
}
为什么printf("%f",*p)和printf("%f",(double)a)结果不一样呢?
不都是强制类型转换吗?怎么会不一样
[解决办法]一只鸡,上帝说它是狗,它就能变成只狗。
把一只鸡放一个盒子里,上帝告诉你盒子里是只狗,可其实里面还是只鸡,你当它是狗就怎么看怎么奇怪。
[解决办法]double 是8字节,而且编码格式也不一样,不能用指针强转
printf("%f\n",(double(a))); 这里相当于有个临时double变量等于a
[解决办法](1)
首先建议你看下 IEEE754中关于浮点数的存储。然后看我给你讲的。
a是int型,内存(小端)中的表示是
0000 1010 0000 0000 0000 0000 0000 0000 后面的位不确定
double型占用8 个字节,如果将上述字节看做double,第一位是符号位,第2~12位是阶码,第12~64是位数,
0000 1010 0000 0000 0000 0000 0000 0000 后面的不确定,
那么你可以转换成 实数算下,应该很小(小数点的后6位肯定都是零),输出的时候默认为6位小数,发生截断,所以是0.000000
(2)printf("%f\n",(double(a)));发生类型转化,这个可以,一般 sizeof比较小的类型可以转换成 size比较大
的类型,或者是类型提升或者是转换
[解决办法]和printf("%f",10/3);一样
[解决办法]这个孩子脑子错乱了,他的谬论到处都是,又跑到这里来害人了。