【问题标题】:Bitwise Shifting Issue in CC中的按位移位问题
【发布时间】: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


【解决方案1】:

问题已解决:感谢@LPs,

我将断点向下传输了 3 行,错误的值刚刚变为真。我不知道为什么,但我已经将断点放在了一个我确信 for 循环已经完成的地方。现在效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多