C 中的按位移位问题
Bitwise Shifting Issue in C
我有一个 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
观察它。此外,我可以同时观察到第一个片段 window 并且值是正确的。
更新:这是两种方式的分解。
第一个片段:
第二个片段:
编译器:ARM GCC 4.9-2015-q1-update
调试器:赛普拉斯 PSoC Creator 3.3
单片机:CYBLE-022001
我会联系Cypress,我想他们可以给个提示。如果我们解决了,我会post回答。
问题已解决:感谢@LPs,
我将断点向下传输到 3 行,错误的值变为真。我不知道为什么,但我已经将我的断点放在我确定 for 循环已经完成的地方。现在效果很好。
我有一个 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
观察它。此外,我可以同时观察到第一个片段 window 并且值是正确的。
更新:这是两种方式的分解。
第一个片段:
第二个片段:
编译器:ARM GCC 4.9-2015-q1-update
调试器:赛普拉斯 PSoC Creator 3.3
单片机:CYBLE-022001
我会联系Cypress,我想他们可以给个提示。如果我们解决了,我会post回答。
问题已解决:感谢@LPs,
我将断点向下传输到 3 行,错误的值变为真。我不知道为什么,但我已经将我的断点放在我确定 for 循环已经完成的地方。现在效果很好。