如何|操作员工作?

时间:2018-05-21 13:10:17

标签: c++ bit-manipulation

我对|感到困惑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 :(得分:5)

你不能左移负数,这样做会调用未定义的行为:任何事情都可能发生。同样,右移负数也是一个坏主意,因为这可能导致算术或逻辑右移。

您必须将变量转换为无符号类型,移位,然后转换回来。例如:

d1 = ((uint32_t)BUF[1] << 8) ...

答案 1 :(得分:3)

左移一个负数的行为是 undefined ,而在C ++ 14之前,你很容易受到signed char的不同补充方案的影响。 (来自C ++ 14 signed charchar,如果signed必须是2的补码。)

为了轻松生活,只写

BUF[1] * 256 + BUF[0]

注意到此表达式的类型int