【问题标题】:What happened to operator '+'? [closed]运算符“+”发生了什么? [关闭]
【发布时间】:2026-02-07 23:05:02
【问题描述】:

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

我真的不知道我做错了什么。请检查这张图片:

iBienSuCo1 += result[18] 之前一切都很好。我不知道数据来自哪里。 在这种情况下有什么想法吗?

【问题讨论】:

  • 什么意思?你+=你的变量。
  • iBienSuCo1 是什么?!另外,您在访问result[18]之前是否安全地检查了范围?!
  • 对不起。 iBienSuCo1unsigned intresult[18]char
  • @HoangTran:你的预期输出是什么??
  • 请提供minimal reproducible example。并且永远不要粘贴充满文本的代码和错误图片,粘贴文本本身

标签: c++ qt qt-creator


【解决方案1】:

result[17] 是一个 char 值 0x00。

result[18] 是一个 char 值 0xC0。

您的编译器将char 实现为带符号类型,因此编译器会将char 值符号扩展为signed int,然后再将其分配/添加到unsigned int 变量。 0xC0的高位为1,所以扩展位用1填充,产生0xFFFFFFC0,解释为无符号整数时为4294967232,解释为有符号整数时为-64。

要做你想做的事,用这个代替:

iBienSuCo1 = (unsigned char)result[17];
iBienSuCo1 = (iBienSuCo1 << 8) | (unsigned char)result[18];

通过在扩展之前将char 转换为unsigned char(而不是unsigned int!),编译器将对值进行零扩展(扩展位用0 填充)而不是符号扩展。这将产生您正在寻找的 0x000000C0 的结果。

live demo

【讨论】:

  • 我昨天用你上面提到的同样的方法解决了这个问题。谢谢,美好的一天。
【解决方案2】:

这是我对你问题的理解,

#include <iostream>
using namespace std;

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

所以在将i 添加到-64 之前,这就是您的iBieSucol,它是无符号整数,其值为UINT_MAX(对于32 位)。然后你减去 64。

【讨论】:

  • 你想要什么?我没有发现任何问题
  • 明白。我将代码更改为:iBienSuCo1 = (unsigned int)result[17]; iBienSuCo1 = (iBienSuCo1 &lt;&lt; 8) | (unsigned int)result[18]; 但还是一样。
  • 试着把这些数字写成二进制格式你会知道为什么会这样
  • 我想将result[17]result[18]的数据复制到iBienSuCo1result[17] 是高字节,result[18] 是低字节。