Frage

Ich bin Initialisierung eines unsigned short int mit a = 0xff (alle Bits sind gesetzt). Dann weisen I b zu a >> 7, die ergeben sollte (0000 0001), und es tut. Jedoch ist die ungeradee Sache, dass, wenn I c zu einem << 7 zuzuordnen, ist es nicht äquivalent ist zu (1000 0000). Getestet habe ich diese durch 0x80 Ausgeben und c (die 1000 0000), aber sie sind nicht das gleiche.

Hier ist ein Code:

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

Ich bin nicht sicher, was das Problem ist. Jede Hilfe ist willkommen. Danke.

P. S. Mit „Ausgang“ meine ich Ausgang 0x80 und c in Dezimal und Hex-Form.

War es hilfreich?

Lösung

a short int hat 16, nicht nur 8 Bit.

So werden Sie wahrscheinlich von 0xff "0111 1111 1000 0000" als das Ergebnis bekommen << 7.

Andere Tipps

Sie bei Bittypen nicht erraten, Verwendung <stdint.h>


A short int "in der Regel" hat 16 Bits. Eigentlich bin ich ziemlich sicher, dass es immer hat 16 mit Ausnahme des Mars Computer, aber das ist nicht etwas, was der Standard verspricht.

Wenn Sie Typen deklarieren möchten, die eine bestimmte Anzahl von Bits haben, die konforme Technik ist:

#include <stdint.h>

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

Auf diese Weise würde haben Ihre nicht-ganz-richtige Vermutung an der Bit-Darstellung von short vermieden. Aus irgendeinem Grund ist Microsoft weit weg von zu dem C99-Standard entspricht, auch auf einfache Dinge wie <stdint.h>. Glücklicherweise ein Projekt unterhält eine VC ++ stdint Version .

Ich würde erwarten, dass Sie 0x7f80 bekommen. Ich denke, was Sie schreiben gemeint ist:

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

Leider VC ++ (die C-Compiler) nicht inttypes.h, weil es nicht vollständig C99 unterstützt leider. Sie müssen 3rd-Party-Header (zum Beispiel Paul Hsiehs stdint.h) verwenden.

Wenn Sie dieses Ergebnis erhalten möchten, können Sie das Teil abhacken a << 7 größer ist als die der 8. niedrigstwertigen Bit, mit bitweise und:

unsigned short int c = (a << 7) & 0xff;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top