This is more to do with the C language than stm32 microcontrollers in particular. But I shouldn't criticise your question for that.
There are a few ways to do this.
The low 16 bits may be obtained by anding the 32-bit value with 0xffff. And the high bits by right-shifting by 16 then anding with 0xffff.
uint16_t low16 = adcResult & 0xffff;
uint16_t high16 = (adcResult >> 16) & 0xffff;
Some might regard this as inefficient because of the shifting and anding. Another way to do this is by way of a union:
union u_tag {
uint32_t adc32;
uint16_t adc16[2];
} u;
u.adc32 = adcResult;
/* results are now in u.adc16[0] and u.adc16[1]; */
I'm sure others can suggest yet more ways to do this.
Hope this helps,
Danish