c++ - 为什么我的函数打印 '0' ?

标签 c++ c floating-point int format-specifiers

这是我的代码,我不完全知道为什么会发生这种情况:

#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/

相关文章:

c++ - 自一周开始以来的秒数?

c++ - Totalview:有没有办法硬编码断点?

c++ - +=、|=、&= 等是原子的吗?

c++ - 在 OSX 中以编程方式抓取屏幕截图

c - 在C中按行对由数据结构组成的矩阵进行排序

c - 如何在命令行的语言环境中显示文本?

c++ - 为什么在条件运算符 (?:), 第二和第三个操作数必须具有相同的类型?

java - 使用java解压二进制php packed float

以任意精度实现 ROUND_HALF_UP float 的 Pythonic 方法

c++ - 除了 IEEE754 之外,还有其他常用的浮点格式吗?