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

Rad*_*row 6 c

嗨考虑这段代码:

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)

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

Bas*_*tch 8

我假设你p有意义地初始化(指向一些有效的位置).

然后,在p[0] + (p[1] << 8)p[1]将被隐式提升为unsigned做左移之前<< 8,这样的代码有一定道理(例如,在32个像ARM处理器).非正式地,它产生一个16位数,其低8位来自,p[0]而高8位来自p[1]

总的来说,隐含规则是在C算术运算中int至少是(至少在较小的数据上,如shortuint8_tchar).但细节更复杂(从C89到C99和C11标准略有发展).

  • 假设类型为`uint8_t`,由于_integer promotions_,`p [1]`将被隐式地转换为`int`(如果你愿意,则为`signed`).在这种情况下没有别的办法. (4认同)
  • 术语怪癖:没有*隐式铸造*这样的东西.演员总是明确的.这里发生的是*促销*或*转换*. (3认同)

Nas*_*asr 4

首先: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 个字节开始,其原因可能是因为他是从每单位时间(周期)仅发送一个字节的总线获取它的。