This question already has answers here:
What happens when you bit shift beyond the end of a variable?

(3 个回答)


1年前关闭。




我目前正在尝试从名为 addr 的地址中提取一些位,其中包含一个名为 mask 的 32 位掩码,并将其提取到另一个名为 result 的变量中,如下所示
int addr = 7;
int x = 0;
uint32_t mask = 0xFFFFFFFF;
result = addr & (mask >> (32 - x));

当 x = 0 时,我期望结果为 0,这在在线位移计算器上得到证实。但是在 C 代码中,result 是 1。这是为什么呢?

最佳答案

您正在执行非法位移。

移位大于或等于左操作数的位大小的值会导致 undefined behavior 。这记录在 C standard 的第 6.5.7p3 节中:



这意味着您需要检查 x 的值,如果它是 0,则只使用 0 作为位掩码。

int x = 0;
uint32_t mask = 0xFFFFFFFF;
...
if (x == 0) {
    result = 0;
} else {
    result = addr & (mask >> (32 - x));
}

关于c - C 中意外的位移行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59294683/

10-13 06:41