首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作符是如何工作的?

操作符是如何工作的?
EN

Stack Overflow用户
提问于 2018-05-21 13:10:16
回答 2查看 105关注 0票数 0

我觉得与C++中的the操作符混淆了。我有代码来传输从单片机读取的数据。高8位与低8位分开。数据(代码中的BUF )存储补码。所以我使用(BUF[1] << 8) | BUF[0]获取我的原始数据。然而,结果却有点奇怪。例如,现在的代码获取d1=-84。如图所示,为什么|运算符得不到我想要的结果?

代码语言:javascript
复制
#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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-21 13:16:42

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

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

代码语言:javascript
复制
d1 = ((uint32_t)BUF[1] << 8) ...
票数 5
EN

Stack Overflow用户

发布于 2018-05-21 13:18:43

左移负数的行为是没有定义的,在C++14之前,您很容易受到signed char的不同补充方案的影响。(如果C++14 signed charcharsigned,则必须是2的补码。)

要想过轻松的生活,只写一篇

代码语言:javascript
复制
BUF[1] * 256 + BUF[0]

注意到此表达式的类型是int

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50449660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档