Ich habe eine 32-Bit-Nummer und ich möchte 4 Stücke von 8-Bit-Nummern daraus erstellen. Zum Beispiel:Bitweises Verschieben Problem in C
Wenn die 32-Bit-Zahl 0xABCD1234
ist, die 8-Bit-Array muss so sein:
dataArray[0] = 0x34; dataArray[1] = 0x12; dataArray[2] = 0xCD; dataArray[3] = 0xAB;
So habe ich herausgefunden, dass ich es durch Verschieben der 32- implementieren Bit-Wert und Maskierung des LSB-Teils. Unterhalb Schnipsel funktioniert gut:
uint32_t uniquenumber = 0xABCD1234;
uint8_t dataArray[8];
int j;
uint32_t shifted = 0;
for(j=0;j<4;j++)
{
shifted = (uniquenumber>>(j*8));
dataArray[j] = shifted & (0xFF);
}
Aber wenn ich versuche, es zu verkürzen, indem die shifted
Variable zu entfernen und ihre Berechnung direkt mit dem Haupt Berechnung transportieren, funktioniert es nicht. Ich konnte den Unterschied nicht herausfinden, warum es nicht funktioniert. Hier ist das bearbeitete Snippet, das nicht funktioniert.
uint32_t uniquenumber = 0xABCD1234;
uint8_t dataArray[8];
int j;
for(j=0;j<4;j++)
{
dataArray[j] = (uniquenumber>>(j*8)) & (0xFF);
}
Der Ausgang dieses zweiten Schnipsel ist hier:
dataArray[0] = 0x34; dataArray[1] = 0x12; dataArray[2] = 0x00; //False. dataArray[3] = 0xAB;
By the way, das ist ein Embedded-Programm auf einem Mikrocontroller arbeiten. Ich glaube nicht, dass es ein Druckproblem ist, weil ich es nicht durch eine Druckoperation beobachte. Ich beobachte es mit einem Watch
im Debug-Modus. Außerdem kann ich das erste Snippet am selben Fenster beobachten und die Werte sind korrekt.
Update: Hier sind die Unterschiede für beide Wege.
Für ersten Schnipsel:
Und für den zweiten Code-Schnipsel:
Compiler: ARM GCC 4,9-2015-q1-Update
Debugger: Cypress PSoC Creator 3.3
MCU: CYBLE-022001
Ich werde einen Kontakt mit Cypress herstellen, ich denke, sie können einen Hinweis darauf geben. Ich werde die Antwort veröffentlichen, wenn wir es lösen.
[Beide scheinen mir ok] (http://ideone.com/TE1IO2). Was ist falsch an deiner zweiten Lösung? Was ist die Ausgabe? – LPs
Welcher Typ ist verschoben? –
Ich habe die Ausgabe des zweiten Snippets hinzugefügt. –