неверное значение переменной после сдвига битов и сложения в c - PullRequest
3 голосов
/ 18 апреля 2019

У меня есть этот код, который в основном берет два целых числа и сдвигает каждое и добавляет их.Однако после сложения я получил неверное значение.

Я нашел выход из этого (то есть, сохранив смещенные значения в новых переменных unsigned 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;
}

1 Ответ

5 голосов
/ 18 апреля 2019

Оператор + имеет более высокий приоритет , чем операторы смещения. Вам необходимо написать:

out[0] = (in[0]<<2) + (in[1]>>2);

Без скобок он был оценен как

out[0] = in[0] << (2 + in[1]) >> 2;

GCC показывает это предупреждение при компиляции вашего кода с предупреждениями:

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

Это пример того, почему мы всегда должны обращать внимание на предупреждения компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...