【发布时间】:2016-07-27 10:11:36
【问题描述】:
我有一个 32 位数字,我想从中创建 4 个 8 位数字。例如:
如果 32 位数字是0xABCD1234,
8位数组必须是这样的:
dataArray[0] = 0x34;
dataArray[1] = 0x12;
dataArray[2] = 0xCD;
dataArray[3] = 0xAB;
所以我发现我可以通过移动 32 位值并屏蔽 LSB 部分来实现它。以下 sn-p 效果很好:
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 变量并将其计算直接传输到主计算来缩短它,它就不起作用。我无法弄清楚区别,为什么它不起作用。这是编辑后的sn-p,它不起作用。
uint32_t uniquenumber = 0xABCD1234;
uint8_t dataArray[8];
int j;
for(j=0;j<4;j++)
{
dataArray[j] = (uniquenumber>>(j*8)) & (0xFF);
}
第二个sn-p的输出在这里:
dataArray[0] = 0x34;
dataArray[1] = 0x12;
dataArray[2] = 0x00; //False.
dataArray[3] = 0xAB;
顺便说一下,这是一个在微控制器上运行的嵌入式程序。我认为这不是打印问题,因为我没有通过打印操作观察它。我在调试模式下使用Watch 观察它。另外,我可以在同一个窗口观察到第一个 sn-p 并且值是正确的。
更新:这是两种方式的拆卸。
对于第一个 sn-p:
对于第二个 sn-p:
编译器:ARM GCC 4.9-2015-q1-update
调试器:赛普拉斯 PSoC Creator 3.3
MCU:CYBLE-022001
我将与 Cypress 联系,我想他们可以就此给出提示。如果我们解决它,我会发布答案。
【问题讨论】:
-
Both seem ok to me。您的第二个解决方案有什么问题?输出是什么?
-
转换什么类型?
-
代码没问题。我确定问题出在其他地方。您可以尝试比较为两个版本生成的程序集。
-
你在哪里设置断点来停止程序并查看内存内容?
-
@LPs 哇,我将断点传送到 3 行以下,错误的值刚刚变为真。我不知道为什么,但我已经将断点放在了一个我确信 for 循环已经完成的地方。现在效果很好。谢谢!
标签: c bit-shift disassembly