我做了一个小函数,它将十六进制颜色值转换为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说明符。
感谢您的帮助。
答案 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;
}