C中的按位移位问题

时间:2016-07-27 10:11:36

标签: c bit-shift disassembly

我有一个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);
}

但是如果我试图通过删除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观察它。此外,我可以在同一个窗口观察第一个片段并且值是正确的。

更新:以下是两种方式的解散。

对于第一个片段:

enter image description here

对于第二个片段:

enter image description here

编译器:ARM GCC 4.9-2015-q1-update

调试器:赛普拉斯PSoC Creator 3.3

MCU:CYBLE-022001

我将与赛普拉斯联系,我猜他们可以给出一个暗示。如果我们解决,我会发布答案。

1 个答案:

答案 0 :(得分:0)

问题解决了:感谢@LPs,

我将断点传输到3行并且错误的值才变为真。我不知道为什么,但我已经把断点放到了一个我确定for循环已经完成的地方。它现在运作良好。