我有一个32位数字,我想从中创建4个8位数字.例如:
如果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); }
但是,如果我试图通过移除移位变量并将其计算直接传输到主计算来缩短它,则它不起作用.我无法弄清楚差异,为什么它不起作用.这是编辑后的代码段不起作用.
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; //假.
dataArray [3] = 0xAB;
顺便说一句,这是一个在微控制器上工作的嵌入式程序.我认为这不是打印问题,因为我没有通过打印操作来观察它.我在调试模式下使用Watch观察它.此外,我可以在同一窗口观察第一个片段,并且值是正确的.
更新:以下是两种方式的解散.
对于第一个片段:
而对于第二个片段:
编译器:ARM GCC 4.9-2015-q1-update
调试器:赛普拉斯PSoC Creator 3.3
MCU:CYBLE-022001
我将与赛普拉斯联系,我猜他们可以给出一个暗示.如果我们解决它,我会发布答案.