嗨考虑这段代码:
uint16_t dest_pid;
uint8_t *p;
pf->dest_pid = p[0] + (p[1] << 8) //(p[1] << 8) equals 0 right?
Run Code Online (Sandbox Code Playgroud)
此代码是嵌入式操作系统驱动程序的一部分.一些想法可能是该声明背后的想法?或者可能是我遗失了一些必要的东西?
我假设你p有意义地初始化(指向一些有效的位置).
然后,在p[0] + (p[1] << 8)该p[1]将被隐式提升为unsigned做左移之前<< 8,这样的代码有一定道理(例如,在32个像ARM处理器).非正式地,它产生一个16位数,其低8位来自,p[0]而高8位来自p[1]
总的来说,隐含规则是在C算术运算中int至少是(至少在较小的数据上,如short或uint8_t或char).但细节更复杂(从C89到C99和C11标准略有发展).
首先:dest_pidafterpf是结构的一部分,我认为它是另一个变量 thenuint16_t dest_pid;
Second:p是一个指向 的指针uint8_t,当你这样做时,(p[1] << 8)你会将指针内部的内容移动 8,例如,如果p[1] = 0xE5移动后它将是0xE500。请记住,您将结果放入dest_pid2 字节变量中。
最后一行的翻译很可能取 的低字节(不太重要)pid并将其添加到 的高字节(移位 8)pid并将其放入pf->dest_pid,你可能会想为什么他不从 发送 2 个字节开始,其原因可能是因为他是从每单位时间(周期)仅发送一个字节的总线获取它的。
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |