操作员怎么了+'?

时间:2017-09-14 03:04:36

标签: c++ qt qt-creator

我正在使用Qt Creator(社区版)构建一个软件,该软件可以从具有RS-485连接的设备读取数据。

我真的不知道自己做错了什么。请查看此图片:

Operator+

一切都很好,直到iBienSuCo1 += result[18]。我不知道数据的来源。 在这种情况下有任何想法吗?

2 个答案:

答案 0 :(得分:2)

result[17]的{​​{1}}值为0x00。

char的{​​{1}}值为0xC0。

您的编译器将result[18]实现为有符号类型,因此编译器会将char值签名扩展为char,然后将其分配/添加到char变量。 0xC0的高位为1,因此扩展位用1填充,产生0xFFFFFFC0,当解释为无符号整数时为4294967232,在解释为有符号整数时为-64。

要做你想做的事,请改用:

signed int

通过在扩展之前将unsigned int强制转换为iBienSuCo1 = (unsigned char)result[17]; iBienSuCo1 = (iBienSuCo1 << 8) | (unsigned char)result[18]; (而不是char!),编译器将对值进行零扩展(扩展位用0填充)而不是符号 - 延伸。这将产生您正在寻找的0x000000C0的结果。

live demo

答案 1 :(得分:0)

以下是我对您的问题的理解,

#include <iostream>
using namespace std;

int main() {
    unsigned int i = -1;
    ++i;
    i += -64;
    cout << i << endl;
}

所以在将i添加到-64之前,那是你的iBieSucol,它是unsigned int,它的值是UINT_MAX(对于32位)。然后你减去64.