Получается так: *(uint16_t*)( (uint16_t*)(base+seg)+REG )=data;
*( (uint16_t*)(base+seg)+REG )=data;
Не могу понят. Ожидал, что:
(uint16_t*)(base+seg)+REG имеет тип (uint16_t*), то есть, должна сработать арифметика указателей и результат сложения указателя + целого, должен иметь такой же тип указателя, как и был.
Соответственно, дополнительное приведение типа к тому же типу, что и был, не должно ничего ломать.