我正在使用Qt Creator(社区版)构建一个软件,该软件可以从具有RS-485连接的设备读取数据。
我真的不知道自己做错了什么。请查看此图片:
一切都很好,直到iBienSuCo1 += result[18]
。我不知道数据的来源。
在这种情况下有任何想法吗?
答案 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的结果。
答案 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.