如何将列表的两个元素复制到一个更大的元素中?
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];
不要那样做,您会在许多系统上得到错误的结果,并且可能会在某些系统上直接导致崩溃。这是未定义的行为。
这是一个例子:
我有一个 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];
不要那样做,您会在许多系统上得到错误的结果,并且可能会在某些系统上直接导致崩溃。这是未定义的行为。