如何将列表的两个元素复制到一个更大的元素中?

How to copy two elements of a list into one bigger element?

这是一个例子:

我有一个 uint8_t 元素的列表(这不是真正的代码 ^^):

List[0] = 0010 1001
List[1] = 0100 0111

并且有一个无符号短元素(uint8_t 大小的两倍)。

我希望我的短元素是这样的:0010 1001 0100 0111

我可以这样移动它吗:

ShortElement = (unsigned short) UnsignedInt8List[0];

或者我必须使用二进制调整来移动它吗?

谢谢:)

不,您不能简单地转换值。由于unsigned short总能代表uint8_t中的值,因此该值将保持不变。如果您这样做 ShortElement = (unsigned short) UnsignedInt8List[0];ShortElement 将被分配值 0000 0000 0010 1001

您应该使用按位运算来组合这些值:

ShortElement = ((unsigned short) UnsignedInt8List[0] << 8) |
               ((unsigned short) UnsignedInt8List[1] << 0);

这比它需要的要冗长一点,但为了清楚起见,我已经包含了所有内容。它可以等价地写成:

ShortElement = ((unsigned short) UnsignedInt8List[0] << 8) | UnsignedInt8List[1];

一个注意事项是要小心你的类型。你知道 uint8_t 的大小,但你不知道 unsigned short 正好是 16 位长,你只知道它必须至少有 16 位长才能容纳范围 [ 0, 65535]。由于最少 16 位,这在您展示的任何内容中都不是问题,甚至经常建议在安全方便的情况下使用非固定宽度类型,但要记住这一点。


一个可能很诱人但你不应该做的是使用指针来获取值:

// DO NOT DO THIS, IT IS THE WRONG WAY
ShortElement = *(unsigned short *) &UnsignedInt8List[0];

不要那样做,您会在许多系统上得到错误的结果,并且可能会在某些系统上直接导致崩溃。这是未定义的行为。