J'ai besoin de combiner deux valeurs signées à 8 bits sur une valeur courte (16 bits) signée. Il est important que le signe ne soit pas perdu.
Mon code est: p> le résultat que je reçois est Pour les exemples suivants, je reçois les résultats corrects avec le même code: P> -13 code>. Cependant, je m'attends à ce que ce soit
499 code>. P>
msb = -1; lsb = -6; combined = -6;
msb = 1; lsb = 89; combined = 345;
msb = -1; lsb = 13; combined = -243;
7 Réponses :
Il est possible que lsb code> soit automatiquement étendu à 16 bits. Je remarque que vous avez un problème que lorsqu'il est négatif et que MSB est positif et c'est ce que vous vous attendez à arriver, étant donné la façon dont vous utilisez le ou l'opérateur. Bien que vous faites clairement quelque chose de très étrange ici. Qu'est-ce que tu essayes réellement de faire ici? P>
Merci Dan! Les données du fichier que j'ai lu sont stockées sous forme d'entiers signés à 8 bits avec toujours le LSB suivi d'abord par le MSB. Pour utiliser ces données, j'ai besoin de les combiner dans un court-circuit de 16 bits. J'ai lu dans le fichier comme char et convertir en _int8. Comment faire cela correctement?
@Natalie: J'ai bien peur de ne pas penser à ce que vous dites a du sens. Comment les octets individuels d'une représentation entière multi-octets sont-ils même avoir i> une notion de "signe"? Pourquoi ne laissez-vous pas simplement lire les deux octets dans un bref bref signé d'être fait avec elle?
Désolé, je n'ai pas inventé ce format de fichier. Je dois lire dans l'ensemble du dossier comme le fichier car le fichier contient également des pièces ASCII et toutes les données du fichier ne doivent pas être combinées en short. J'ai besoin d'abord pour séparer les données pour obtenir ceux stockés comme indiqué à 8 bits.
Votre LSB dans ce cas contient 0xFFF3. Lorsque vous ouez avec 1 << 8 rien ne change car il y a déjà un 1 en position de bit. P>
Essayez Court combiné = (MSB << 8) | (LSB & 0XFF); code> p>
Vous avez écrit, que vous devez combiner deux valeurs 8 bits. Pourquoi vous utilisez Cela vous donne le résultat attendu: non signé court code> alors?
Comme
dan code> déjà dit,
lsb code> est automatiquement étendu à 16 bits. Essayez le code suivant:
499 code>. P> p> p>
J'ai essayé d'utiliser uint8_t mais mon compilateur ne connaît pas ce type et #include
Pour que vs utilise non signé __int8 code> et
__ int16 code> types.
Si c'est ce que vous voulez:
short combine(unsigned char msb, unsigned char lsb) { return (msb<<8u)|lsb; }
Vous avez raison! Désolé, j'ai mélangé MSB et LSB pour cet exemple et le corrigé dans mon message. Merci!
ou en utilisant un syndicat:
Non souhaitable d'utiliser des syndicats en raison de problèmes de portabilité.
RAISONNESE C Complier pour STM8 (et, éventuellement, de nombreux autres compilateurs) génèrent du code laid pour le code C classique lors de la rédaction de variables 16 bits en registres matériels de 8 bits. Remarque - STM8 est BIG-Endian, pour le code CPUS peu-Endian doit être légèrement modifié. La commande d'octet de lecture / écriture est importante aussi.
SO, Pièce Code C Standard C: P>
unsigned int uSonicRange; ... uSonicRange = TIM1_CCR2H << 8; uSonicRange |= TIM1_CCR2L;
Certaines choses que vous devriez connaître sur les types de données ( un em>) signés em> court em> et char em>: Char em> est une valeur de 8 bits, c'est ce que vous recherchez pour lsb em> et msb em>. courte em> est de 16 bits de longueur. p> Vous ne devez pas non plus stocker signé les valeurs em> signées dans non signé em> ceux que vous savez ce que vous savez ce que vous savez Faites. P> Vous pouvez regarder Le complément des deux . Il décrit la représentation des valeurs négatives (pour les entiers, non pour les valeurs à virgule flottante) en C / C ++ et de nombreuses autres langages de programmation. P> Il existe plusieurs versions de la fabrication de votre propre complément: P> stdint.h (avec inttypes. h) est plus dans le but d'avoir des longueurs exactes pour votre variable. Si vous avez vraiment besoin d'une variable pour avoir une longueur d'octets spécifique, vous devez utiliser cela (vous en avez besoin ici). P> Vous devez utiliser chaque fois que vous utilisez des fichiers de données qui correspondent à vos besoins. Votre code doit donc ressembler à ceci: p> ou comme ceci: p> pour la dernière fois que le compilateur utilisera Signé des valeurs 8/16 bits à chaque fois quelle que soit la longueur int em> sur votre plate-forme. Wikipedia a obtenu une belle explication de la int8_t em> et int16_t < / EM> DataTypes (et tous les autres DataTypes). P> BTW: CPPreference.com a> est utile pour regarder le Normes ANSI C et autres choses qui valent la peine de savoir sur c / C ++. P> p>
Les chiffres sont représentés dans EN.Wikipedia.org/wiki/two%27S_Complement . C'est ce qui se passe lorsque vous ou les numéros de complément des 2 2 2 2 Ne pas.
Pourquoi vos «valeurs 8 bits signées» stockées dans un
non signé court code>?