2016-07-27 24 views
7

Mam 32-bitowy numer i chcę utworzyć z niego 4 kawałki 8-bitowych liczb. Na przykład:Bitwise Shifting Issue in C

Jeśli liczba 32-bitowa jest 0xABCD1234, tablica 8-bitowy musi być tak:

dataArray[0] = 0x34; dataArray[1] = 0x12; dataArray[2] = 0xCD; dataArray[3] = 0xAB;

więc pomyślałem, że mogę wdrożyć go przez przesunięcie 32- wartość bitowa i maskowanie części LSB. Poniżej urywek działa dobrze:

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); 
} 

Ale gdy próbuję go skrócić usuwając zmienną shifted i transportowania swoje obliczenia bezpośrednio do głównego obliczeń, to nie działa. Nie mogłem zrozumieć różnicy, dlaczego to nie działa. Oto edytowany fragment, który nie działa.

uint32_t uniquenumber = 0xABCD1234; 
uint8_t dataArray[8]; 
int  j; 

for(j=0;j<4;j++) 
{ 
    dataArray[j] = (uniquenumber>>(j*8)) & (0xFF); 
} 

Wyjście tym drugim fragmencie jest tutaj:

dataArray[0] = 0x34; dataArray[1] = 0x12; dataArray[2] = 0x00; //False. dataArray[3] = 0xAB;

Nawiasem mówiąc, jest to wbudowany program roboczy na mikrokontrolera. Nie sądzę, że jest to problem drukowania, ponieważ nie obserwuję go przez operację drukowania. Obserwuję to przy użyciu trybu debugowania Watch. Ponadto widzę pierwszy fragment w tym samym oknie, a wartości są poprawne.

Aktualizacja: tutaj są dissamblies dla obu sposobów.

Na pierwszym fragmencie:

enter image description here

I za drugim fragmencie:

enter image description here

Compiler: ARM GCC 4.9-2015-Q1-update

Debugger: Cypress PSoC Creator 3.3

MCU: CYBLE-022001

Nawiążę kontakt z Cypress, myślę, że mogą dać wskazówkę na ten temat. Napiszę odpowiedź, jeśli ją rozwiążemy.

+5

[Obie wydają mi się ok] (http://ideone.com/TE1IO2). Co jest nie tak w twoim drugim rozwiązaniu? Co to jest wyjście? – LPs

+1

Jaki typ jest przesunięty? –

+0

Dodałem dane wyjściowe z drugiego fragmentu. –

Odpowiedz

0

Problem rozwiązany: Dzięki @LPs,

ja transportowane punkt przerwania do 3 linii w dół i wartość, która była źle Właśnie prawda. Nie wiem dlaczego, ale już wprowadziłem mój punkt przerwania w miejsce, gdzie jestem pewien, że pętla for została zakończona. Teraz działa dobrze.