实型数按整型输出会影响数据本身是吗?
本帖最后由 风之残月 于 2014-11-10 10:44 编辑如图,实型数按整型输出会影响数据本身是吗?
数据本身没有变,只是float在内存中的存放格式就和int不同,所以用int的方式读取float数据,一般就变成0了 漩涡鸣人 发表于 2014-9-24 18:24
数据本身没有变,只是float在内存中的存放格式就和int不同,所以用int的方式读取float数据,一般就变成0了
那为什么第二个数也显示为0.000000了 不会,因为f数据类型本身没有变化,只是(int)f这个整体的类型是int型,这本身不能够改变f的数据类型,也不能改变其数值大小 xia_米 发表于 2014-9-24 19:05
那为什么第二个数也显示为0.000000了
第一个读取失败之后,第二个%f继续读取上次失败留下来的数据,在printf里面类型混用可能会出很多问题的 肯定要影响的 哦,我意思是输出要影响。但存储数据的地方是不影响的 数据本身不会变,只是会改变显示内容 printf("%d%f",(int)f,f) 楼上正解!!学习了 首先,printf函数会自动将float类型的参数自动转换为double类型的参数。
所以printf("(int)f=%d, f=%f\n",f,f);函数的3个参数类型为const char*,double,double
double类型在32位系统下占据8个字节。
C语言对函数的处理是先将函数参数从右到左入栈,然后函数体内在读取这些参数进行处理。
所以printf函数被调用前会先将两个f(double类型)入栈,再将const char*类型参数(即字符串地址)入栈。
于是这三个参数在堆栈中的地址可能为(这仅仅是假设的情况):
const char*类型参数地址:4
第一个f参数地址: 8
第二个f参数地址: 16
而printf中的格式化字符串中是%d...%f所以printf函数会将地址8处的参数认为是一个int类型(即取该double类型的低4字节地址作为int类型),紧接着取地址12处的8个字节作为第2个double参数,所以这两个参数都错了。
根据上面的分析,你可以将
printf("(int)f=%d, f=%f\n",f,f);改为
printf("(int)f=%f, f=%d\n",f,f);就会发现第一个参数%f正确的打印出来了。
页:
[1]