c pow函数打印错误值但函数返回正确结果

时间:2015-09-02 07:41:01

标签: c windows

我做了一个小函数,它将十六进制颜色值转换为c中的rgb值。

如果我把它传递给#008080"该功能正常工作。我明白了:

HEX: #008080 RGB: 0, 128, 128

我遇到的问题是当我尝试打印pow()返回的值时(出于调试目的),这就是我得到的:

EX::: 0
POWER::: 0.000000
EX::: 1
POWER::: 0.000000
EX::: 0
POWER::: 0.000000
EX::: 1
POWER::: 0.000000
EX::: 0
POWER::: 0.000000
EX::: 1
POWER::: 0.00000

这是输出此代码的代码:

int num = 0;
char c;
double power;

for (int i = strlen(hexString), ex = 0; i > 0; i--, ex++) {
    c = hexString[i - 1];
    power = pow(16.0, ex);
    printf("EX::: %d\n", ex);
    printf("POWER::: %lf\n", power);       
    num += convertHexCharToDec(&c) * power;
}

如果我使用GDB运行它,我可以看到power变量的值为1然后是16。

这是什么问题?函数输出正确的值,我可以在调试器中看到正确的值,为什么我看不到正确的值?

由于

编辑: 增加了功率变量类型

EDIT2: 在用printfs说明符搞砸了一点之后,我发现我应该使用%f说明符。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您应首先检查您未显示的power类型。

格式说明符与传递给printf的变量之间的不一致是未定义的行为,这就是原因:

#include <stdio.h>

int main (void) {
    int i = 42;
    double d = 3.14159;
    printf("POWER::: %lf\n", i);
    printf("POWER::: %lf\n", d);
    return 0;
}

可以给你:

POWER::: 0.000000
POWER::: 3.141590

逍遥法外。

更详细的原因为什么可能会发生这些错误的结果,请参阅this answer。它没有具体涵盖浮点值,但理论是相同的。如果你告诉printf期待一件事然后给它一个完全不同的东西,你很难抱怨它是否会混淆: - )

如果power是整数类型,则需要将其更改为非整数类型,或更改格式说明符。无论如何,他们应该匹配。

在任何情况下,如果您有32位整数(并且颜色代码都是24位),则根本不需要使用浮点来完成此任务。您可以使用以下代码:

for (int i = strlen(hexString), mult = 1; i > 0; i--, mult *= 16) {
    c = hexString[i - 1];
    printf("MULT::: %d\n", mult);       
    num += convertHexCharToDec(&c) * mult;
}