我正在使用Qt Creator(Community Version)構建一個軟件,該軟件可以從具有RS-485連接的設備讀取數據。運營商'+'發生了什麼?
我真的不知道我做錯了什麼。請檢查這幅畫:
一切都很好,直到iBienSuCo1 += result[18]
。我不知道數據來自哪裏。 在這種情況下有什麼想法嗎?
我正在使用Qt Creator(Community Version)構建一個軟件,該軟件可以從具有RS-485連接的設備讀取數據。運營商'+'發生了什麼?
我真的不知道我做錯了什麼。請檢查這幅畫:
一切都很好,直到iBienSuCo1 += result[18]
。我不知道數據來自哪裏。 在這種情況下有什麼想法嗎?
result[17]
是一個char
的值爲0x00。
result[18]
是一個char
值0xC0。
你的編譯器實現char
作爲有符號的類型,因此,編譯器將一個char
值分配之前符號擴展到signed int
/它添加到一個unsigned int
變量。 0xC0的高位爲1,所以擴展位填充1,生成0xFFFFFFC0,解釋爲無符號整數時爲4294967232,解釋爲有符號整數時爲-64。
做你正在嘗試做的,用這個來代替:(!不要unsigned int
)擴展之前
iBienSuCo1 = (unsigned char)result[17];
iBienSuCo1 = (iBienSuCo1 << 8) | (unsigned char)result[18];
通過鑄造char
到unsigned char
,編譯器將零擴展的值(擴展位填充0)而不是符號擴展。這將產生您正在尋找的0x000000C0的結果。
我以上面昨天提到的相同方式解決了這個問題。謝謝你,美好的一天。 –
這裏是我的你的問題的理解,
#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 << 8)| (unsigned int)result [18];' 但它仍然是一樣的。 –
嘗試以二進制格式編寫這些數字你會知道爲什麼你會得到這個 –
你是什麼意思?你+ ='你的變量。 – aghilpro
什麼是iBienSuCo1?另外,在訪問'result [18]'之前,您是否安全地檢查了範圍? – CroCo
對不起。 'iBienSuCo1'是'unsigned int','result [18]'是'char'。 –