我有以下数据
uint8_t d1=0x01;
uint8_t d2=0x02;
我想将它们组合为uint16_t
uint16_t wd = 0x0201;
我该怎么做?
我有以下数据
uint8_t d1=0x01;
uint8_t d2=0x02;
我想将它们组合为uint16_t
uint16_t wd = 0x0201;
我该怎么做?
uint16_t wd = ((uint16_t)d2 << 8) | d1;
(0x0002 << 8) | 0x01 = 0x0200 | 0x0001 = 0x0201
最简单的方法是:
256U*d2+d1
uint8_t d1=0x01;
uint8_t d2=0x02;
uint16_t wd = (d2 << 8) | d1;
只要 d2 <= INT8_MAX
,这总是有良好定义的行为,因为d2始终是正值且永远不会溢出。
(INT8_MAX可在stdint.h中找到。)
uint8_t
是默认存在的,因此CHAR_BIT
等于8。而且在实践中,CHAR_MAX
并不总是0x7f。有很多系统中,普通的char
类型是无符号的。 - R.. GitHub STOP HELPING ICEINT8_MAX
是 127。虽然当 d2<=127
时可以证明 d2<<8
不会溢出,但原因是 INT_MAX
至少应为 32767,但不必更大。 - R.. GitHub STOP HELPING ICEint
类型的表达式中使用无法表示为int
的值似乎更适合描述这种未定义行为。 - autistic(uint16_t)((d2 << 8) + (d1 & 0x00ff))
d2
(编辑后的帖子已经处理了这个问题)。 - Jonathan Grynspan(int)0x02 << 8
总是定义良好的。从一般的编程角度来看,你是正确的。 - Lundinint
的推广使转换变得多余,我总是更喜欢看到像这样的代码 - 它实际上是一个意图的“注释”。但是@R..给出了一个答案,任何优化编译器都会生成高效(例如移位)指令,没有等级/转换问题。 - Brett Hale