我正在将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
上面的代码可以完成工作,但是我不确定这是正确/最佳方法。
答案 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;