Как работает |оператор работает? - PullRequest
0 голосов
/ 21 мая 2018

Я чувствую себя смущенным с |оператор в C ++.У меня есть код для передачи данных, которые читаются из MCU.Старшие 8 бит отделены от младших 8 бит.И данные (код BUF) хранят номер дополнения.Поэтому я использую (BUF[1] << 8) | BUF[0] для получения необработанных данных.Тем не менее, результат немного странный.Например, теперь код получить d1=-84.Как показано на рисунке, почему оператор | не получает результаты, как я хочу?enter image description here

#include <cstdlib>
#include <cstdio>
#include <cmath>
#include<iostream>

int main() {
    signed char BUF[2];
    BUF[0] = -84;
    BUF[1] = -2;
    short d1;
    d1 = (BUF[1] << 8) | BUF[0];  // | operator
    std::cout << d1 << std::endl;
    std::cin.get();
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Поведение при смещении влево отрицательного числа равно undefined , и до C ++ 14 вы уязвимы для различных дополняющих схем для signed char.(Из C ++ 14 signed char и char, если это signed должно быть дополнением до 2).

Для облегчения жизни напишите просто

BUF[1] * 256 + BUF[0]

, отметив, что тип этого выражения является int.

0 голосов
/ 21 мая 2018

Вы не можете сдвигать отрицательные числа влево, это вызывает неопределенное поведение: может произойти все что угодно.Аналогичным образом, смещение вправо отрицательных чисел также является плохой идеей, поскольку это может привести к арифметическому или логическому смещению вправо.

Вам необходимо привести переменную к типу без знака, сместить, а затем преобразовать обратно.Например:

d1 = ((uint32_t)BUF[1] << 8) ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...