c中的位移和加法后,变量值不正确

Bab*_*sta 3 c

我有这段代码,基本上需要两个整数并将每个整数移位并相加。但是,添加之后,我得到了一个不正确的值。

我找到了一种解决方法(即通过将移位后的值存储在新的无符号int变量中并将其相加),但是我想了解为什么此方法不起作用:

void change(uint8_t in[3], uint16_t out[2]){
    out[0] = in[0]<<2 + in[1]>>2;
    printf("%u\n",in[0]<<2 ); // outputs 48  --- correct
    printf("%u\n",in[1]>>2 ); // output 1 --- correct
    printf("%u\n",out[0] ); // output 768 --- wrong, I expected 49
}

int main(int argc, char const *argv[])
{
    uint8_t in[3] = {12,6,9};
    uint16_t out[2];
    change(in,out);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

tas*_*oor 5

运营商+具有较高的优先级比移位运算符。您需要写:

out[0] = (in[0]<<2) + (in[1]>>2);
Run Code Online (Sandbox Code Playgroud)

没有括号,它被评估为

out[0] = in[0] << (2 + in[1]) >> 2;
Run Code Online (Sandbox Code Playgroud)

GCC在编译代码时显示以下警告:

test.c:5:23: warning: suggest parentheses around ‘+’ inside ‘<<’ [-Wparentheses]
     out[0] = in[0]<<2 + in[1]>>2;
                       ^
Run Code Online (Sandbox Code Playgroud)

这是为什么我们应该始终注意编译器警告的示例。

  • @Babydesta 是警告,而不是错误。请检查您的编译器文档以了解如何打开警告。对于 GCC,我总是使用 `-Wall -Wextra`。 (2认同)