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
Que voulez-vous dire? vous '+ =' votre variable. – aghilpro
Qu'est-ce que 'iBienSuCo1'? Aussi, vérifiez-vous la plage en toute sécurité avant d'accéder 'result [18]'? – CroCo
Désolé pour ça. 'iBienSuCo1' est' unsigned int', 'result [18]' est 'char'. –