我对|感到困惑C ++中的运算符。我有代码来传输从MCU读取的数据。高8位与低8位分开。并且数据(代码中的BUF)存储补号。所以我使用(BUF[1] << 8) | BUF[0]
来获取原始数据。但是,结果有点奇怪。例如,现在代码获得d1=-84
。如图所示,为什么|
运算符不能得到我想要的结果?
#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();
}
答案 0 :(得分:5)
你不能左移负数,这样做会调用未定义的行为:任何事情都可能发生。同样,右移负数也是一个坏主意,因为这可能导致算术或逻辑右移。
您必须将变量转换为无符号类型,移位,然后转换回来。例如:
d1 = ((uint32_t)BUF[1] << 8) ...
答案 1 :(得分:3)
左移一个负数的行为是 undefined ,而在C ++ 14之前,你很容易受到signed char
的不同补充方案的影响。 (来自C ++ 14 signed char
和char
,如果signed
必须是2的补码。)
为了轻松生活,只写
BUF[1] * 256 + BUF[0]
注意到此表达式的类型是int
。