2017-09-14 8 views
-6

Qt Creator(Community Version)を使用してRS-485接続のデバイスからデータを読み取るソフトウェアを構築しています。演算子 '+'はどうなりましたか?

私が間違っていることは本当にわかりません。この写真を確認してください:

Operator+

すべての罰金iBienSuCo1 += result[18]まで。私はデータがどこから来るのか分からない。 このような状況でアイデアはありますか? iはそれがint型符号なしであり、その値は(32ビット用)UINT_MAXであなたのiBieSucolで、-64に追加される前にここで

+0

どういう意味ですか?あなたの変数は '+ ='です。 – aghilpro

+0

「iBienSuCo1」とは何ですか?また、 'result [18]'にアクセスする前に安全にレンジをチェックしていますか? – CroCo

+0

申し訳ありません。 'iBienSuCo1'は' unsigned int'、 'result [18]'は 'char'です。 –

答えて

2

result[17]は0x00の値charです。

result[18]は、charの値0xC0です。

コンパイラコンパイラがあろうようunsigned int変数に追加する/割り当てる前signed intchar値を符号拡張、署名されたタイプとしてcharを実現します。 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; 
} 

です。次に、それを64だけ減算します。

+0

何が欲しいですか?私は何も間違って表示されません –

+0

理解。私のコードをこれに変更しました: 'iBienSuCo1 =(unsigned int)result [17]; iBienSuCo1 =(iBienSuCo1 << 8)| (unsigned int)result [18]; ' それでも同じです。 –

+0

これらの数値をバイナリ形式で書き込もうとしたら、なぜあなたはそれを得るのか知っています –

関連する問題