gpt4 book ai didi

c - C 中意外的位移行为

转载 作者:行者123 更新时间:2023-12-03 00:50:16 25 4
gpt4 key购买 nike

我目前正在尝试从名为 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 节中。 :

The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand. If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined.

这意味着您需要检查 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com