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

问题描述 投票:0回答:1

这里是一个例子:

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

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

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

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

我可以这样移动它吗:

ShortElement = (unsigned short) UnsignedInt8List[0];

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

谢谢:)

c list casting copying
1个回答
1
投票

不,您不能简单地转换值。由于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位,甚至在安全和方便的情况下,甚至建议使用非固定宽度类型,但要记住这一点。


这可能很诱人,但您应该not要做的是使用指针来获取值:

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

请勿这样做,在许多系统上都会得到错误的结果,它可能会直接导致某些系统崩溃。这是不确定的行为。

© www.soinside.com 2019 - 2024. All rights reserved.