嗨,考虑一下这段代码:
uint16_t dest_pid;
uint8_t *p;
pf->dest_pid = p[0] + (p[1] << 8) //(p[1] << 8) equals 0 right?
此代码是嵌入式操作系统驱动程序的一部分。 一些想法可能是该声明背后的想法?或者可能是我遗失了一些必要的东西?
答案 0 :(得分:8)
我假设你的p
被有意义地初始化(指向某个有效位置)。
然后在p[0] + (p[1] << 8)
中,p[1]
会在执行左移unsigned
之前隐式提升为<< 8
,因此代码确实有意义(例如在32位处理器上臂)。非正式地,它产生一个16位数字,其低8位来自p[0]
,而高8位来自p[1]
粗略地说,隐含的规则是C算术运算至少在int
上(并且从不在short
或uint8_t
或char
等较小的数据上)。但细节更复杂(并且从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个字节,原因可能是因为他从一个每单位时间(周期)只发送一个字节的总线获取它。