我觉得与C++中的the操作符混淆了。我有代码来传输从单片机读取的数据。高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();
}发布于 2018-05-21 13:16:42
您不能左移负数,这样做会调用未定义的行为:任何事情都可能发生。同样,右移负数也是个坏主意,因为这可能导致算术或逻辑上的右移。
您必须将变量转换为无符号类型,shift,然后再转换回。例如:
d1 = ((uint32_t)BUF[1] << 8) ...发布于 2018-05-21 13:18:43
左移负数的行为是没有定义的,在C++14之前,您很容易受到signed char的不同补充方案的影响。(如果C++14 signed char和char是signed,则必须是2的补码。)
要想过轻松的生活,只写一篇
BUF[1] * 256 + BUF[0]注意到此表达式的类型是int。
https://stackoverflow.com/questions/50449660
复制相似问题