是这样的,double d = 3.4; int b = 858993459; 在这里,你的d 和 b其实在计算机中都是以二进制方式存储的,无论是浮点数还是整数都是二进制的存在内存当中,对吧?计算机无法知道你在该块内存中存的到底是浮点数还是整数,但c是怎么知道的呢?在这里,C程序是用你所使用的格式化说明符来访问该变量,就是说怎么解释存在这个地址中的二进制的含义,你用%lf就会以浮点方式访问这些二进制,你用%d就是用整型方式访问这些存在内存中的二进制,其实在这里3.4 和 858993459 在内存中的二进制是一样的,由于是一样的数值在内存中,你用什么格式说明符访问,就怎么解释他们,所以会有这样的结果啦。
int main(void) { double a = 3.4; printf("%d\n", a); printf("%lf\n", a); return 0; }
在我的机子上输出结果是 858993459 3.400000 毫无疑问,我刚刚说的得到了验证了。。。 [解决办法] 试试这个看结果 int main (){ double a = 3.4; printf("%lld,%llx\n", a,a); printf("%lf\n", a); long long *la =(long long)&a; unsigned int * ia=(int *)&a; printf("%lld,%llx\n", *la,*la); printf("%d,%d\n", *ia,*ia);
return 0; } 结果如下:
as long long = 4614838538166547251,400b333333333333 as double = 3.400000 ptr cast to long long ,value=4614838538166547251,400b333333333333 ptr cast to unsigned int ,val =858993459,1074475827 至于 贴主的代码 #include <stdio.h> int main (int argc, char* argv[ ]) { double d = 3.4; int b = 858993459; printf("%d\n", d);//%d-->int int 比double内存占用小, // char, short, int---》int; // int 32Bits 参数传递时是4字节,double 8字节 // 够用,截取一部分使用而已
printf("%lf\n", b);//%lf,%f --->double ,b---》 int 4字节 不够用,则拼凑
// 堆栈当前内容: // [ b ]实参 b // [EFLAGS ] 状态寄存器, // [ret address = next code address ]返回地址 // [ ]printf的自动变量 return 0; }
是这样的,double d = 3.4; int b = 858993459; 在这里,你的d 和 b其实在计算机中都是以二进制方式存储的,无论是浮点数还是整数都是二进制的存在内存当中,对吧?计算机无法知道你在该块内存中存的到底是浮点数还是整数,但c是怎么知道的呢?在这里,C程序是用你所使用的格式化说明符来访问该变量,就是说怎么解释存在这个地址中的二进制的含义,你用%lf就会以浮点方式访问这些二进制,你用%d就是用整型方式访问这些存在内存中的二进制,其实在这里3.4 和 858993459 在内存中的二进制是一样的,由于是一样的数值在内存中,你用什么格式说明符访问,就怎么解释他们,所以会有这样的结果啦。