потыкал я эти преобразования. Так как char - знаковый (в данной реализации), то static_cast и си-каст производят расширение со знаком (забивают единицами старшие разряды). Решение - сначала кастовать к беззнаковому uint8_t, а уже потом расширять до uint16_t. Крч:
uint16_t value = (uint8_t)my_char