结果应该同操作系统和编译器,CPU都相关。
比如如果是16位机器,那么我们知道int只是用16比特数据,而float使用32比特,如果float参数和int参数都是压入同一个堆栈,那么实际上就会将float数据高16比特当成int数使用。于是输出结果通常也会比较简单,但是不会总是0,当然如果32位机器,所有参数都是用同一堆栈。
而对于intel的*86机器,除了普通堆栈,机器内部还有一个硬件浮点栈(可以保存16个浮点数,也可以看成是浮点寄存器),于是编译器可以选择对于浮点类型的参数,通过浮点栈而不是堆栈传递数据。于是对于楼主这样的代码,print函数会总是去浮点栈里面取数据,而你传入的int型参数会被压入普通堆栈,但是数据没有被使用。如果代码里面没有使用过浮点数,那么通常浮点栈是空的,于是看到的结果总是0很正常。但是我们不能保证所有的平台/编译器都会如此实现,所以有可能换一种平台/编译器结果就不同了。
另外对于某些CPU,由于寄存器非常多,编译器还可以选择将所有参数都通过寄存器传递,这时浮点和定点寄存器也可能分离,对于这样的CPU,结果也同样是不可以预测的
调试代码
#include
#define MALLOC(type,n) (type*)malloc(n*sizeof(type))
int main()
{
float*p = MALLOC(float,5);
int i = 0;
for(i = 0; i<5; i++)
{
p[i] = i+1.5;
printf("%d\n",(int)(p[i]));
}
free(p);
return 0;
}
阅读(3567) | 评论(0) | 转发(0) |