这段C代码的某些部分对我来说没有意义

时间:2015-08-27 11:26:21

标签: c

嗨,考虑一下这段代码:

uint16_t dest_pid;
uint8_t *p;

pf->dest_pid = p[0] + (p[1] << 8)   //(p[1] << 8) equals 0 right?

此代码是嵌入式操作系统驱动程序的一部分。 一些想法可能是该声明背后的想法?或者可能是我遗失了一些必要的东西?

2 个答案:

答案 0 :(得分:8)

我假设你的p被有意义地初始化(指向某个有效位置)。

然后在p[0] + (p[1] << 8)中,p[1]会在执行左移unsigned之前隐式提升为<< 8,因此代码确实有意义(例如在32位处理器上臂)。非正式地,它产生一个16位数字,其低8位来自p[0],而高8位来自p[1]

粗略地说,隐含的规则是C算术运算至少在int上(并且从不在shortuint8_tchar等较小的数据上)。但细节更复杂(并且从C89到C99和C11标准略有进化)。

答案 1 :(得分:4)

首先:dest_pid pf是结构的一部分,我认为它是另一个变量uint16_t dest_pid;

第二:p是指向uint8_t的指针,当你执行(p[1] << 8)时,你将指针内的内容移动8,例如移位后p[1] = 0xE5移位时是0xE500。请记住,您将结果放在dest_pid中,这是一个2字节的变量。

最后一行的转换最有可能采用pid的低字节(不太重要)并将其添加到pid的高字节(移位8)并将其放入{ {1}},您可能会想到为什么他从一开始就没有发送2个字节,原因可能是因为他从一个每单位时间(周期)只发送一个字节的总线获取它。