Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249811
  • 博文数量: 55
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 419
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-06 20:22
文章分类

全部博文(55)

文章存档

2014年(55)

我的朋友

分类: 嵌入式

2014-03-09 12:43:39

结果应该同操作系统和编译器,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;
}
阅读(3504) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~