#define CONVERT(val, qin, qout) ((qin > qout) ? (val >> (qin-qout) ) : (val << (qout-qin)))
void f(void)
{
...
y = CONVERT(x, 25, 31);
}
GCC会在编译时评估上面的宏吗?我指的是(qin > qout)
部分。编译完成后,我试图只使用y = x << (31-25)
。
在这种情况下,qin > qout
部分最终将成为整数常量表达式,编译器可以在理论上将其优化为1
或0
。
在实践中,它甚至没有做到这一点。看看真正的编译器实际是如何处理您的示例的,-O0
(优化关闭(的gcc和clang只生成左移位的代码,省略了?:
的条件检查和分支,以及第二个永远不为真的操作数。
机器代码最终归结为y = x << 6;
,完全没有分支。