【发布时间】:2016-08-12 12:19:05
【问题描述】:
我有以下 C 程序:
#include <stdio.h>
#include <math.h>
#define LOG2(x) ((int)( log((double)(x)) / log(2) ))
int main() {
int num = 64;
int val1 = LOG2(num);
int val2 = LOG2(64);
printf("val1: %d, val2 %d\n", val1, val2);
return 0;
}
哪些输出:
val1: 5, val2: 6
为什么当我将它与变量一起使用时,这个宏会产生不同(和错误)的答案,但当我直接输入 64 时却能正常工作?
不管这实际上是否是获取日志基数 2 的好方法,是什么导致了这种行为?有什么办法可以让这个宏与变量一起正常工作? (我所有的输入都是 2 的精确幂)
【问题讨论】:
-
对我来说,两个都显示
5:ideone.com/QSVioZ -
对我来说,两者都是6。请问您使用的是哪台机器和编译器?
-
问题似乎是您在宏中对
(int)的转换。删除强制转换允许LOG2返回与声明为double的值相同的值。 -
你使用的是哪个编译器