我有一个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;
顺便说一下,这是一个在微 Controller 上运行的嵌入式程序。我认为这不是打印问题,因为我没有通过打印操作来观察它。我正在 Debug模式下使用Watch对其进行观察。另外,我可以在同一窗口中观察到第一个代码段,并且值正确。

更新:这是两种方式的缺点。

对于第一个片段:

c - C语言中的按位移位问题-LMLPHP

对于第二个片段:

c - C语言中的按位移位问题-LMLPHP

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

调试器: Cypress PSoC Creator 3.3

单片机:CYBLE-022001

我将与 Cypress 联系,我想他们会对此提供提示。如果我们解决了,我将发布答案。

最佳答案

解决的问题:感谢@LP,

我将断点传送到3行,错误的值才正确。我不知道为什么,但是我已经将断点放到了我确定for循环已经完成的地方。现在效果很好。

关于c - C语言中的按位移位问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38609995/

10-11 11:24