这是我的代码,我不完全知道为什么会发生这种情况:
#include <stdio.h>
void foo(float *);
int main()
{
int i = 10, *p = &i;
foo(&i);
}
void foo(float *p)
{
printf("%f\n", *p);
}
输出:
0
最佳答案
正如已经说过的,您将整数变量的地址作为单精度 float 的地址传递。
理想情况下,应该禁止这种隐式转换,但根据编译器以及它是干净的 C 还是 C++,它可能只会导致警告。
但是为什么它打印的正好是 0?
这是因为单精度 FPN 的方式是 represented in memory :
(1 bit of sign)|(8 bits of biased exponent)|(23 bits of significand(mantissa))
10 的二进制是
0|0000 0000|000 0000 0000 0000 0000 0000 1010
因此,当解释为浮点值时:
(sign = 0)(biased exponent = 0)(significand = 10)
有偏指数是正常指数加 127 - http://en.wikipedia.org/wiki/Exponent_bias
为了计算该值,我们将使用以下公式:
floatValue = ((sign) ? (-1) : (1)) * pow(2, normalExponent) * significand
这将产生:
floatValue = 1 * pow (2, 0 - 127) * 10 = 10 * 2 in pow -127.
这是一个非常小的数字,当使用 %f
说明符表示时,它会变成 "0"
字符串。
解决方案:
要解决这个问题,只需在调用 foo
之前使用临时变量和显式转换:
int main()
{
int i = 10;
float temp = (float)i;
foo(&temp);
}
void foo(float *p)
{
printf("%f\n", *p);
}
P.S.为了避免将来出现此类问题,请始终将编译器设置为最现实的警告级别,并始终在运行应用程序之前处理每个警告。
关于c++ - 为什么我的函数打印 '0' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25359783/