这里是一个例子:
我有一个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位,甚至在安全和方便的情况下,甚至建议使用非固定宽度类型,但要记住这一点。
这可能很诱人,但您应该not要做的是使用指针来获取值:
// DO NOT DO THIS, IT IS THE WRONG WAY
ShortElement = *(unsigned short *) &UnsignedInt8List[0];
请勿这样做,在许多系统上都会得到错误的结果,它可能会直接导致某些系统崩溃。这是不确定的行为。