2017-09-14 61 views
-6

我正在使用Qt Creator(Community Version)構建一個軟件,該軟件可以從具有RS-485連接的設備讀取數據。運營商'+'發生了什麼?

我真的不知道我做錯了什麼。請檢查這幅畫:

Operator+

一切都很好,直到iBienSuCo1 += result[18]。我不知道數據來自哪裏。 在這種情況下有什麼想法嗎?

+0

你是什麼意思?你+ ='你的變量。 – aghilpro

+0

什麼是iBienSuCo1?另外,在訪問'result [18]'之前,您是否安全地檢查了範圍? – CroCo

+0

對不起。 'iBienSuCo1'是'unsigned int','result [18]'是'char'。 –

回答

2

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]; 

通過鑄造charunsigned char,編譯器將零擴展的值(擴展位填充0)而不是符號擴展。這將產生您正在尋找的0x000000C0的結果。

live demo

+0

我以上面昨天提到的相同方式解決了這個問題。謝謝你,美好的一天。 –

0

這裏是我的你的問題的理解,

#include <iostream> 
using namespace std; 

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

所以之前i加入到-64,這是你的iBieSucol是無符號整數,其值是UINT_MAX(32位)。然後你將其減去64.

+0

你想要什麼?我沒有看到任何錯誤 –

+0

瞭解。我將我的代碼更改爲: 'iBienSuCo1 =(unsigned int)result [17]; iBienSuCo1 =(iBienSuCo1 << 8)| (unsigned int)result [18];' 但它仍然是一樣的。 –

+0

嘗試以二進制格式編寫這些數字你會知道爲什麼你會得到這個 –