我有一个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);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我试图通过删除shifted变量并将其计算直接传输到主计算来缩短它,它就不起作用.我无法弄清楚差异,为什么它不起作用.这是编辑后的代码段不起作用.
uint32_t uniquenumber = 0xABCD1234;
uint8_t dataArray[8];
int j;
for(j=0;j<4;j++)
{
dataArray[j] = (uniquenumber>>(j*8)) & (0xFF);
}
Run Code Online (Sandbox Code Playgroud)
第二个片段的输出在这里:
dataArray[0] = 0x34;
dataArray[1] = 0x12;
dataArray[2] = 0x00; //False.
dataArray[3] = 0xAB;
顺便说一句,这是一个在微控制器上工作的嵌入式程序.我认为这不是打印问题,因为我没有通过打印操作来观察它.我正在使用Watch调试模式观察它.此外,我可以在同一窗口观察第一个片段,并且值是正确的.
更新:以下是两种方式的解散.
对于第一个片段:
而对于第二个片段:
编译器:ARM …
我实际上通过测试看到了一些结果,但我想知道哪种方式更好,为什么.
问题1:每当我一次又一次调用该函数时,是否会声明局部变量?我知道最好在尽可能最窄的范围内声明变量.但我无法阻止自己将其声明为全局变量并使其仅被声明一次,而不是在每个函数调用中.或者,它是否在每个函数调用中再次声明?我知道局部变量的范围只是那个函数.因此,当它离开该函数时,它必须忘记该变量,因为它超出了它的范围吗?
问题2:当我有一些需要存储其先前内容的函数变量(例如计时器计数器变量)时,哪种方式更好:将它们声明为全局变量或将它们声明为静态局部变量?每当我调用该函数时,我都不需要它们获取它们的初始值,我已经将它们设置为零或者等等.
我想确定一些事情,
当我有多个if/else条件并且if并不意味着其中一个else条件的if条件; 下一个else陈述是否适用于最后一个if陈述?
例如:
if(condition1)
{
//operation1
}
if(condition2)
{
//operation2
}
else
{
//operation3.
}
Run Code Online (Sandbox Code Playgroud)
像上面的例子一样,如果我不使用a else作为第一个if语句,哪个if语句else可以用于?如果我没有指定else每个问题,这会对我造成问题if吗?
我做了一些测试,但想确定这实际上是如何工作的.