2016-07-27 18 views
7

轉移問題我有一個32位的數字和我想從它創建4個8位的數字。例如:按位用C

如果32比特數爲0xABCD1234, 8位陣列必須是這樣的:

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

所以我想通了,我可以通過移動32執行它位值並掩蔽LSB部分。下面摘錄效果很好:

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

但如果我嘗試通過刪除shifted變量,直接運送其計算主要計算縮短,這是行不通的。我無法弄清楚差異,爲什麼它不起作用。這是編輯的代碼片段不起作用。

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

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

第二個片段的輸出是在這裏:

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

順便說一句,這是一種嵌入程序上的微控制器工作。我不認爲這是一個打印問題,因爲我沒有通過打印操作觀察它。我在調試模式下使用Watch觀察它。另外,我可以在同一個窗口觀察第一個片段,並且數值是正確的。

更新:這裏有兩種方式dissamblies。

對於第一片段:

enter image description here

而對於第二片斷:

enter image description here

編譯器:ARM GCC 4.9-2015-Q1-更新

調試器:賽普拉斯PSoC Creator中3.3

MCU:CYBLE-022001

我將與Cypress的接觸,我想他們可以給這個提示。如果我們解決了問題,我會發布答案。

+5

[雙方似乎確定以我(http://ideone.com/TE1IO2)。你的第二個解決方案有什麼問題?什麼是輸出? – LPs

+1

什麼類型被轉移? –

+0

我添加了第二個片段的輸出。 –

回答

0

問題解決了:由於@LPs,

我運斷點到3線下來,這是錯的只是得到真正的價值。我不知道爲什麼,但我已經把我的斷點放到了一個我確信for循環已經完成的地方。它現在運作良好。