Нет, вы не можете просто преобразовать значение. Поскольку 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];
Не делайте этого, вы получите неправильный результат на многих системах, а на некоторых он может сразу вызвать ошибку sh. Это неопределенное поведение.