小编abd*_*nar的帖子

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);
}
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 …

c bit-shift disassembly

7
推荐指数
1
解决办法
267
查看次数

它是否会影响将函数变量声明为本地而非全局的效率?

我实际上通过测试看到了一些结果,但我想知道哪种方式更好,为什么.

问题1:每当我一次又一次调用该函数时,是否会声明局部变量?我知道最好在尽可能最窄的范围内声明变量.但我无法阻止自己将其声明为全局变量并使其仅被声明一次,而不是在每个函数调用中.或者,它是否在每个函数调用中再次声明?我知道局部变量的范围只是那个函数.因此,当它离开该函数时,它必须忘记该变量,因为它超出了它的范围吗?

问题2:当我有一些需要存储其先前内容的函数变量(例如计时器计数器变量)时,哪种方式更好:将它们声明为全局变量或将它们声明为静态局部变量?每当我调用该函数时,我都不需要它们获取它们的初始值,我已经将它们设置为零或者等等.

c variable-declaration

2
推荐指数
1
解决办法
103
查看次数

else语句遵循哪个顺序?

我想确定一些事情,

当我有多个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吗?

我做了一些测试,但想确定这实际上是如何工作的.

c conditional if-statement

0
推荐指数
1
解决办法
168
查看次数