在arduino中将两个uint8字节转换为uint16字节的最佳方法是什么?

时间:2019-12-22 18:52:58

标签: c arduino byte bit

我正在将Arduino与ESP32一起使用,但我仍处于初学者水平。我有两个字节,分别是uint8和变量,我想将它们转换为uint16。哪种方法最好呢?我认为移位应该很好

uint8_t first = 0xFF; //lets assume its variable, not constant
uint8_t second = 0xEE;
uint16_t combined = (first << 8) + second;
Serial.println(combined, HEX); // prints FFEE

上面的代码可以完成工作,但是我不确定这是正确/最佳方法。

1 个答案:

答案 0 :(得分:1)

  

哪种方法最好?我认为移位应该很好

使用32位int/unsigned时,以下所有功能都是相同的,并且编译器可以发出相同的代码。

uint8_t first, second;
...
uint16_t combined = (first << 8) + second;
uint16_t combined = (first << 8) | second;
uint16_t combined = (first << 8) ^ second;
uint16_t combined = (first * 256) + second;
uint16_t combined = (first * 256) | second;
....

考虑到编译器是好的,什么是“最好的”可能是“以上任何一个”。

对我来说,如果我认为编译器可能很弱,我将按照以下代码进行编写。

uint16_t combined = ((unsigned)first << 8) | second;

否则,我将按照有意义的代码进行编码。如果本质上是算术运算,则以下内容:

uint16_t combined = (first * 256u) + second;  // recommended

最后,我可能会尝试使用union技巧来强制执行弱编译,但是这种微优化相对于维护工作具有可疑的性能优势。


对于16位int/unsigned,最好避免int溢出。

uint16_t combined = ((uint16_t)first << 8) | second;
uint16_t combined = (first * 256u) + second;