运算符“+”发生了什么?
What happened to operator '+'?
我正在使用 Qt Creator(社区版)构建一个软件,它可以从具有 RS-485 连接的设备读取数据。
我真的不知道我做错了什么。请检查这张图片:
在 iBienSuCo1 += result[18]
之前一切都很好。我不知道数据来自哪里。
这种情况有什么想法吗?
这是我对你的问题的理解,
#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。
result[17]
是一个 char
值 0x00。
result[18]
是 0xC0 的 char
值。
您的编译器将 char
实现为有符号类型,因此编译器会将 char
值符号扩展为 signed int
,然后 assigning/adding 将其扩展为 unsigned int
变量。 0xC0的高位为1,所以扩展位补1,得到0xFFFFFFFC0,解释为无符号整数时为4294967232,解释为有符号整数时为-64。
要完成您想要做的事情,请改用它:
iBienSuCo1 = (unsigned char)result[17];
iBienSuCo1 = (iBienSuCo1 << 8) | (unsigned char)result[18];
通过在扩展前将 char
转换为 unsigned char
(而不是 unsigned int
!),编译器将对值进行零扩展(扩展位用 0 填充)而不是符号扩展。这将产生您要查找的结果 0x000000C0。
我正在使用 Qt Creator(社区版)构建一个软件,它可以从具有 RS-485 连接的设备读取数据。
我真的不知道我做错了什么。请检查这张图片:
在 iBienSuCo1 += result[18]
之前一切都很好。我不知道数据来自哪里。
这种情况有什么想法吗?
这是我对你的问题的理解,
#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。
result[17]
是一个 char
值 0x00。
result[18]
是 0xC0 的 char
值。
您的编译器将 char
实现为有符号类型,因此编译器会将 char
值符号扩展为 signed int
,然后 assigning/adding 将其扩展为 unsigned int
变量。 0xC0的高位为1,所以扩展位补1,得到0xFFFFFFFC0,解释为无符号整数时为4294967232,解释为有符号整数时为-64。
要完成您想要做的事情,请改用它:
iBienSuCo1 = (unsigned char)result[17];
iBienSuCo1 = (iBienSuCo1 << 8) | (unsigned char)result[18];
通过在扩展前将 char
转换为 unsigned char
(而不是 unsigned int
!),编译器将对值进行零扩展(扩展位用 0 填充)而不是符号扩展。这将产生您要查找的结果 0x000000C0。