2017-09-14 3 views
-6

J'utilise Qt Creator (Community Version) pour créer un logiciel capable de lire les données d'un appareil avec une connexion RS-485.Qu'est-il arrivé à l'opérateur '+'?

Je ne sais pas vraiment ce que je fais mal. S'il vous plaît vérifier cette image:

Operator+

Tout va bien jusqu'à ce que iBienSuCo1 += result[18]. Je ne sais pas d'où proviennent les données. Y a-t-il des idées dans cette situation?

+0

Que voulez-vous dire? vous '+ =' votre variable. – aghilpro

+0

Qu'est-ce que 'iBienSuCo1'? Aussi, vérifiez-vous la plage en toute sécurité avant d'accéder 'result [18]'? – CroCo

+0

Désolé pour ça. 'iBienSuCo1' est' unsigned int', 'result [18]' est 'char'. –

Répondre

2

result[17] est une valeur char de 0x00.

result[18] est une valeur char de 0xC0.

Votre compilateur implémente char comme un type signé, de sorte que le compilateur d'extension de signe d'une valeur char à un signed int avant d'attribuer/ajouter à une variable unsigned int. Le bit haut de 0xC0 est 1, donc les bits étendus sont remplis avec 1s, produisant 0xFFFFFFC0, qui est 4294967232 lorsqu'il est interprété comme un entier non signé, et est -64 lorsqu'il est interprété comme un entier signé.

Pour faire ce que vous essayez de faire, utilisez plutôt: (non à unsigned int)

iBienSuCo1 = (unsigned char)result[17]; 
iBienSuCo1 = (iBienSuCo1 << 8) | (unsigned char)result[18]; 

par coulée char à unsigned char avant l'extension, le compilateur-étendre zéro les valeurs (les bits étendues sont remplis avec 0s) au lieu de sign-extend. Cela produira le résultat de 0x000000C0 que vous recherchez.

live demo

+0

J'ai résolu le problème de la même manière que vous avez mentionné ci-dessus hier. Merci et bonne journée. –

0

Voici ma compréhension de votre question,

#include <iostream> 
using namespace std; 

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

donc avant i a été ajouté à -64, c'est votre iBieSucol qui est unsigned int et sa valeur est UINT_MAX (32 bits). Ensuite, vous le soustrayez de 64.

+0

que voulez-vous? Je ne vois rien de mal –

+0

Compris. J'ai changé mon code pour ceci: 'iBienSuCo1 = (unsigned int) résultat [17]; iBienSuCo1 = (iBienSuCo1 << 8) | (unsigned int) résultat [18]; ' Mais c'est toujours la même chose. –

+0

essayez d'écrire ces nombres au format binaire vous saurez pourquoi vous obtenez cela –