c - 按位 C 表达式在函数中返回不同的结果?

标签 c function bit-manipulation bit

这个表达式是计算 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/

相关文章:

r - 函数参数作为R函数中的参数

C 位字段(可能是位精度)

c++ - 可能是C中的指针问题

c - 静态函数和普通函数中的变量

c - 内核3.3.8中process_backlog和softnet_data字段的理解

c - 在 yacc 中处理 block

javascript - onClick 函数 "this"返回窗口对象

python - 编写根据参数执行不同计算的函数的最佳方法是什么?

c - C 中的 "dynamic bitfield"

c++ - 在 constexpr 函数中使用 MSVC 的 __popcnt