问题出在printf
int main()
{
int i=1;
float f=5;
printf("%d , %f ,%d\n",i,f,i);
printf("%d , %d ,%d ,%d\n",i,f,i,i);
printf("%d , %d ,%d ,%d\n",i,(int)f,i,i);
printf("%d ,%d , %d\n",i,i,f);
system("pause");
return 0;
}
显示如下:
1 ,5.000000 ,1
1 ,0 ,1075052544 ,1
1 ,5 ,1 ,1
1 ,1 ,0
为么第二行第二个i显示不正常,
float f=5;根据IEEE754,那么f的二进制表示=010000001 01000000 00000000 0000000,按照printf %d十进制显示 f 应该是1084227584,而不是1075052544
应该是你float格式用的%d,造成后面int类型t处理不正确。
http://blog.sina.com.cn/s/blog_3d10a88301000aok.html
那个博客说的不好,我补充下。
这是C++语言函数变长参数的特性。
printf会根据类型,从堆栈上取数据来做为参数。int是4个字节,而float是8个字节。所以当你传了ifii其实堆栈上是4+8+4+4个字节分别是这四个变量
使用%d %d %d %d,则是相当于输出了第一、二、三个参数,忽略了最后一个i,而第二个参数则拆分成两半,第一个是0,第二个是1075052544,它都属于那个float
上面都说的对,printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。