This question already has answers here:
What happens when you bit shift beyond the end of a variable?
(3 个回答)
1年前关闭。
我目前正在尝试从名为
当 x = 0 时,我期望结果为 0,这在在线位移计算器上得到证实。但是在 C 代码中,
(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