Question

J'initialise un entier court non signé avec a = 0xff (tous les bits sont définis). Ensuite, j'attribue b à un & Gt; & Gt; 7 qui devrait donner (0000 0001) et c'est le cas. Cependant, ce qui est étrange, c'est que lorsque j'assigne c à un & Lt; & Lt; 7, il n'est pas équivalent à (1000 0000). J'ai testé cela en générant 0x80 (qui est 1000 0000) et c, mais ils ne sont pas identiques.

Voici du code:

unsigned short int a = 0xff;
unsigned short int b = a>>7;
unsigned short int c = a<<7; // c should == 0x80

Je ne sais pas quel est le problème. Toute aide est appréciée. Merci.

P.S. Par & Quot; sortie & Quot; Je veux dire la sortie 0x80 et c sous forme décimale et hexadécimale.

Était-ce utile?

La solution

un int court a 16, pas seulement 8 bits.

Donc, vous aurez probablement " 0111 1111 1000 0000 " comme le résultat de 0xff < < 7.

Autres conseils

Ne devinez pas les types de bits, utilisez <stdint.h>

Un court int & "habituellement &"; a 16 bits. En fait, je suis à peu près sûr que toujours en a 16 sauf pour les ordinateurs martiens, mais ce n’est pas une promesse standard.

Si vous souhaitez déclarer des types ayant un nombre de bits spécifique, la technique de conformité est la suivante:

#include <stdint.h>

  int8_t  a;
 uint8_t  b;
 int16_t  x;
uint16_t  y;

Cela aurait évité votre conjecture pas tout à fait juste à la représentation de bits de short. Pour une raison quelconque, Microsoft est loin de se conformer à la norme C99, même pour des choses simples comme <=>. Heureusement, un projet conserve une version VC ++ stdint .

Je m'attendrais à ce que vous ayez 0x7f80. Je pense que ce que vous vouliez écrire est:

unsigned short int c = b <<7; // c should == 0x80

Malheureusement, VC ++ (le compilateur C) n'a pas inttypes.h car il ne prend pas complètement en charge C99. Vous devez utiliser des en-têtes tiers (par exemple, stdint.h de Paul Hsieh).

Si vous voulez obtenir ce résultat, vous pouvez couper la partie a << 7 supérieure au 8ème bit le moins significatif, en utilisant bitwise-and:

unsigned short int c = (a << 7) & 0xff;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top