将两个uint8_t组合为uint16_t

joh*_*han 20 c

我有以下数据

uint8_t d1=0x01; 
uint8_t d2=0x02; 
Run Code Online (Sandbox Code Playgroud)

我想将它们合并为uint16_t

uint16_t wd = 0x0201;
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

md5*_*md5 35

您可以使用按位运算符:

uint16_t wd = ((uint16_t)d2 << 8) | d1;
Run Code Online (Sandbox Code Playgroud)

因为:

 (0x0002 << 8) | 0x01 = 0x0200 | 0x0001 = 0x0201
Run Code Online (Sandbox Code Playgroud)

  • 不需要演员**. (4认同)
  • 是的.需要首先播放`d2`(编辑后的帖子需要处理). (2认同)

R..*_*R.. 12

最简单的方法是:

256U*d2+d1
Run Code Online (Sandbox Code Playgroud)

  • 噢.现在我们确实有一个用于按位操作的用例,你仍然坚持无聊的算术.;) (5认同)
  • 是的,这个评论是相当幽默的. (3认同)
  • “ &lt;&lt; 8”和“ * 256”是相同的操作,除了前者在更多情况下具有不确定的行为,因此通常是不希望的。除非右边的操作数是可变的,否则几乎没有理由使用&lt;&lt;&lt;或`&gt;&gt;`运算符(在这种情况下,您有一个很好的幂运算符)。 (2认同)

Lun*_*din 6

这很简单.你不需要演员表,你不需要临时变量,你不需要黑魔法.

uint8_t d1=0x01; 
uint8_t d2=0x02; 
uint16_t wd = (d2 << 8) | d1;
Run Code Online (Sandbox Code Playgroud)

这始终是明确定义的行为,因为d2始终是正值,并且永远不会溢出,只要d2 <= INT8_MAX.

(INT8_MAX在stdint.h中找到).