IMHO от переопределения типов указателей тут только вред... переносимость страдает, а эффективность на 8-разр. архитектуре не увеличивается (проц все равно данные по байту жрет).
достаточно
union
{
short word;
struct
{
char high;
char low;
} bytes;
}num;
num.bytes.high=rx[0];
num.bytes.low=rx[1];
num.word //результат
Выглядит достаточно громоздко, зато, по моему, нагляднее, чем сдвиги. если таких операций в программе много, можно забабахать typedef. Или наоборот, неименованные структуры использовать, если компилятор позволяет.
А представление о красоте у всех разное. Если компилер хороший, ассемблерный листинг будет примерно одинаков при любом варианте.