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:
I za drugim fragmencie:
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.
[Obie wydają mi się ok] (http://ideone.com/TE1IO2). Co jest nie tak w twoim drugim rozwiązaniu? Co to jest wyjście? – LPs
Jaki typ jest przesunięty? –
Dodałem dane wyjściowe z drugiego fragmentu. –