这个表达式是计算 2^x 的一种方法(我知道这种方法的危险):
2 << (x-1)
代入 x=0,表达式给出所需的结果 1。但是当它放在函数中时,它总是返回 0:
int fast_2_to_the(int x) {
return 2 << (x-1);
}
这可以在这个程序中观察到:
int main(int argc, char *argv[]) {
printf("2 << (0-1) = %d\n", 2 << (0-1));
printf("fast_2_to_the(0) = %d\n", fast_2_to_the(0));
return 0;
}
给出以下输出:
2 << (0-1) = 1
fast_2_to_the(0) = 0
为什么会这样?我是 C 语言的初学者,最近一直在学习按位运算符,所以如果有任何相关建议,我们将不胜感激。
最佳答案
根据 C99 §6.5.7 ¶3,具有负右操作数的位移位是未定义的行为。这意味着编译器可以自由地发出可能无法可靠工作的代码,以防你有一个负面的转变(或者,根据关于未定义行为的通常规则,它也可能让恶魔从你的 Nose 里飞出来)。
按照评论中的建议,执行该转变的正确方法是 1 << x
,只要结果不超过 int
的范围,它就可以正常工作.
关于c - 按位 C 表达式在函数中返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389952/