Das ist prinzipiell richtig gedacht, du must nur eines bedenken. "returnvar << 16" wird auf dem Datentyp von returnval ausgeführt. Ist returnvar ein uint16_t kommt danach einfach "0" raus. returnvar sollte 32 Bit breit sein, damit das klappt. Am besten alle 4 beteiligten Variablen vorher nach 32 Bit konvertieren.

Am besten auch die Ergebnisse verodern und nicht + .

Gruß
Georg