2016-07-27 27 views
7

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:

enter image description here

Und für den zweiten Code-Schnipsel:

enter image description here

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.

+5

[Beide scheinen mir ok] (http://ideone.com/TE1IO2). Was ist falsch an deiner zweiten Lösung? Was ist die Ausgabe? – LPs

+1

Welcher Typ ist verschoben? –

+0

Ich habe die Ausgabe des zweiten Snippets hinzugefügt. –

Antwort

0

Problem gelöst: Dank @LPs,

ich den Haltepunkt zu 3 Zeilen nach unten und dem Wert transportiert, die falsch war nur wahr bekommt. Ich weiß nicht warum, aber ich habe meinen Breakpoint bereits an einen Ort gelegt, an dem ich sicher bin, dass die for-Schleife beendet ist. Es funktioniert jetzt gut.